2016-04-24 8 views
1

私は多くの投稿を見てきましたが、私が必要としているものを見つけられませんでした。最初に、私はPythonの初心者です(私はPython 2を使用しています)。Pythonでデータセットを作成して、Webを削る

ウェブページ(http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html)からデータを収集しようとしています。素敵なhtmlテーブルに注目してください。私はそれをあまり問題なくリストに読み込むことができました。ただし、リンクが2列あることにも注意してください。最初のリンク列を削除したいのですが(データがリストにあるので、これを行う方法がわかりません)。

第2リンク列はもう少し複雑です。私はタイトル "リンク"を "最後の声明"に置き換えたいと思います。次に、提供された各リンクを参照して、最後のステートメントを取得し、リストを作成した元のテーブルの対応する行に配置します。

最後に、このリストをタブ区切りファイルとして印刷して、データフレームとしてRに読み込むことができます。

これは、noobが処理するための多くです。この問題に正しく対応しているかどうか教えてください。以下は私がこれまでに持っていたコードです。私は何をしたいのか分からなくなっています。私はどのように始めたらよいかわからないからです。

from bs4 import BeautifulSoup 
import requests 
from lxml import html 
import csv 
import string 
import sys 

#obtain the main url with bigger data 
main_url = "http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html" 

#convert the html to BeautifulSoup 
doc = requests.get(main_url) 
soup = BeautifulSoup(doc.text, 'lxml') 

#find in html the table 
tbl = soup.find("table", attrs = {"class":"os"}) 

#create labels for list rows by table headers 
headings = [th.get_text() for th in tbl.find("tr").find_all("th")] 

#convert the unicode to string 
headers = [] 
for i in range(0,len(headings)-1): 
    headers.append(str(headings[i])) 

#access the remaining information 
prisoners = [] 
for row in tbl.find_all("tr")[1:]: 
    #attach the appropriate header to the appropriate corresponding data 
    #also, converts unicode to string 
    info = zip(headers, (str(td.get_text()) for td in row.find_all("td")))  
    #append each of the newly made rows 
    prisoners.append(info) 

#print each row of the list to a file for R 
with open('output.txt', 'a') as output: 
    for p in prisoners: 
     output.write(str(p)+'\n') 
output.close() 

私が苦労している3つの部分のどれかを理解できたら、本当に感謝しています!

答えて

0

UglyStewの必要はありません。 Rの簡潔で表情豊かな掻き取りは、ちょうどで動作します。

こすりには1〜2分を取り、それが彼らのサーバー上の任意のより多くの負荷を避けるためにそう here a link to an R Data file of the resultant data frameそのようなサイトを持っているTXの超良いことだ
library(xml2) 
library(rvest) 
library(pbapply) 
library(dplyr) 

URL <- "http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html" 
pg <- read_html(URL) 

nod <- html_nodes(pg, "table.os")[[1]] 
tab <- html_table(nod) 

last_urls <- html_attr(html_nodes(nod, xpath=".//tr/td[3]/a"), "href") 
last_urls <- sprintf("http://www.tdcj.state.tx.us/death_row/%s", last_urls) 
last_st <- pbsapply(last_urls, function(x) { 
    pg2 <- read_html(x) 
    trimws(html_text(html_nodes(pg2, 
           xpath=".//p[contains(., 'Last Statement')]/following-sibling::p"))) 
}) 

death_row <- mutate(tab[, -c(2:3)], last_statement=last_st) 
death_row <- setNames(death_row, gsub("\\.", "_", tolower(make.names(colnames(death_row))))) 
death_row <- mutate(death_row, date=as.Date(date, "%m/%d/%Y")) 

glimpse(death_row) 

## Observations: 537 
## Variables: 9 
## $ execution  (int) 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, 527, 5... 
## $ last_name  (chr) "Vasquez", "Ward", "Wesbrook", "Garcia", "Freeman", "Mas... 
## $ first_name  (chr) "Pablo", "Adam", "Coy", "Gustavo", "James", "Richard", "... 
## $ tdcj_number (int) 999297, 999525, 999281, 999018, 999539, 999414, 999419, ... 
## $ age   (int) 38, 33, 58, 43, 35, 43, 36, 33, 35, 27, 46, 67, 32, 34, ... 
## $ date   (date) 2016-04-06, 2016-03-22, 2016-03-09, 2016-02-16, 2016-01... 
## $ race   (chr) "Hispanic", "White", "White", "Hispanic", "White", "Whit... 
## $ county   (chr) "Hidalgo", "Hunt", "Harris", "Collin", "Wharton", "Harri... 
## $ last_statement (list) I just want to tell my family thank you, my mom and da... 

+0

ありがとうございます。最初にRを試してみましたが、これは私がよく知っていることですが、xpathとsprintfで行っているパターンの一般化に役立つ適切な文書は見つかりませんでした。だから、私のコードはあなたがlast_urlsを持っているところで終わった。あなたは次回見ることができる場所について何か提案がありますか? – user1723196

+0

私はその日に処理するSGMLが多いときにXPathを学びました。 XML/XPathは人々に飲酒を促すものなので、本当にしなければ深く掘り下げることはお勧めしません。私は、XPathと言ってCSSセレクターを作ったことができると確信していますが、残念ながらXPathで考えると思います。良いを得るための最良の方法は、練習することです。私は包括的な "料理本"のような参照を見ていないが、もし私が見つけたらここにメモを書き留める。 – hrbrmstr

関連する問題