2017-04-18 25 views
1

Python newbieはここで、BeautifulSoupとNLTKを使った私の最初のウェブスクレイピング/単語頻度解析に取り組んでいます。複数のリストをPythonに結合する方法 - BeautifulSoup NLTK解析

私は、犯罪者の最後の声明のテキサス州法務省のアーカイブを掻いています。

各犯罪者のページから分析したいテキストを抽出し、すべての段落のトークンをトークンできるようになったが、段落ごとにトークン化された単語のリストが返されている。私は、リストを組み合わせてトークン化された単語のリストを返して、違反者1人を分析したいと考えています。

私は当初、.joinを使って私の問題を解決できると思っていましたが、段落ごとに1つのリストを返しています。私もitertoolsを試してみました。運がない。

犯罪者の声明で最も一般的な単語を見つけるコードは次のとおりですが、各段落から最も一般的な単語が返されています。 ご協力いただければ幸いです!

from bs4 import BeautifulSoup 
import urllib.request 
import re 
import nltk 
from nltk import FreqDist 
from nltk.tokenize import sent_tokenize, word_tokenize 
from nltk.corpus import stopwords 

resp = urllib.request.urlopen 
("https://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html") 
soup = BeautifulSoup(resp,"lxml", 
from_encoding=resp.info().get_param('charset')) 

for link in soup.find_all('a', href=re.compile('last'))[1:2]: 
    lastlist = 'https://www.tdcj.state.tx.us/death_row/'+link['href'] 
    resp2 = urllib.request.urlopen(lastlist) 
    soup2 = BeautifulSoup(resp2,"lxml", 
from_encoding=resp2.info().get_param('charset')) 
    body = soup2.body 

    for paragraph in body.find_all('p')[4:5]: 
     name = paragraph.text 
     print(name) 

    for paragraph in body.find_all('p')[6:]: 
     tokens = word_tokenize(paragraph.text) 
     addWords = 
     ['I',',','Yes','.','\'m','n\'t','?',':', 
     'None','To','would','y\'all',')','Last','\'s'] 
     stopWords = set(stopwords.words('english')+addWords) 
     wordsFiltered = [] 

     for w in tokens: 
      if w not in stopWords: 
       wordsFiltered.append(w) 

     fdist1 = FreqDist(wordsFiltered) 
     common = fdist1.most_common(1) 
     print(common) 

答えて

0
from bs4 import BeautifulSoup 
import urllib.request 
import re 
import nltk 
from nltk import FreqDist 
from nltk.tokenize import sent_tokenize, word_tokenize 
from nltk.corpus import stopwords 

resp = urllib.request.urlopen("https://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html") 
soup = BeautifulSoup(resp,"lxml", from_encoding=resp.info().get_param('charset')) 
wordsFiltered = [] 
for link in soup.find_all('a', href=re.compile('last'))[1:2]: 
    lastlist = 'https://www.tdcj.state.tx.us/death_row/'+link['href'] 
    resp2 = urllib.request.urlopen(lastlist) 
    soup2 = BeautifulSoup(resp2,"lxml", from_encoding=resp2.info().get_param('charset'))  
    body = soup2.body 

    for paragraph in body.find_all('p')[4:5]: 
     name = paragraph.text 
     print(name) 


    for paragraph in body.find_all('p')[6:]: 
     tokens = word_tokenize(paragraph.text) 
     addWords = ['I',',','Yes','.','\'m','n\'t','?',':','None','To','would','y\'all',')','Last','\'s'] 
     stopWords = set(stopwords.words('english')+addWords) 


     for w in tokens: 
      if w not in stopWords: 
       wordsFiltered.append(w) 

fdist1 = FreqDist(wordsFiltered) 
common = fdist1.most_common(1) 
print(common) 

私は、文ごとに、最も一般的な単語を得るためにあなたのコードを編集しました。あなたが何かを理解していないとコメントしてください。また、反復ごとにリストに追加する場合は、ループ内のリストを宣言しないように常に注意してください。

+0

うわー - それでした!ありがとうDevaraj! – MHolmer

+1

しかし、なぜあなたはEveryに対して 'stopWords'を再構築していますか?くそー。段落?それは時間の巨大な浪費です。 – alexis

+0

@alexisが正しいです。ストップワードリストの作成は、メインループの外側にある必要があります。 –

関連する問題