2016-10-21 3 views
-1

Ich versuche, Daten von dieser Website zu kratzen: Death Row Informationschaben Text von Webseiten mit Python 2.7

Ich habe Probleme mit den letzten Aussagen von allen ausgeführten Täter in der Liste zu kratzen, weil die letzte Aussage ist befindet sich auf einer anderen HTML-Seite. Der Name der URL ist wie folgt aufgebaut: http://www.tdcj.state.tx.us/death_row/dr_info/[lastname][firstname].html. Ich kann mir keinen Weg vorstellen, wie ich die letzten Aussagen dieser Seiten abkratzen und in eine SQLite-Datenbank stellen kann.

Alle anderen Informationen (erwarten für "Täter Informationen", die ich nicht brauche) ist bereits in meiner Datenbank.

Wer kann mir einen Zeiger geben, um in Python damit anzufangen?

Dank

Edit2: Ich weiter ein wenig bekam:

import sqlite3 
import csv 
import re 
import urllib2 
from urllib2 import Request, urlopen, URLError 
from BeautifulSoup import BeautifulSoup 
import requests 
import string 
URLS = [] 
Lastwords = {} 

conn = sqlite3.connect('prison.sqlite') 
conn.text_factory = str 
cur = conn.cursor() 

# Make some fresh tables using executescript() 
cur.execute("DROP TABLE IF EXISTS prison") 
cur.execute("CREATE TABLE Prison (link1 text, link2 text,Execution text, LastName text, Firstname text, TDCJNumber text, Age integer, date text, race text, county text)") 
conn.commit() 


csvfile = open("prisonfile.csv","rb") 
creader = csv.reader(csvfile, delimiter = ",") 
for t in creader: 
    cur.execute('INSERT INTO Prison VALUES (?,?,?,?,?,?,?,?,?,?)', t,) 

for column in cur.execute("SELECT LastName, Firstname FROM prison"): 
    lastname = column[0].lower() 
    firstname = column[1].lower() 
    name = lastname+firstname 
    CleanName = name.translate(None, ",[email protected]'#$" "") 
    CleanName2 = CleanName.replace(" ", "") 
    Url = "http://www.tdcj.state.tx.us/death_row/dr_info/" 
    Link = Url+CleanName2+"last.html" 
    URLS.append(Link) 
for URL in URLS: 
    try: 
     page = urllib2.urlopen(URL) 
    except URLError, e: 
     if e.code ==404: 
      continue 
    soup = BeautifulSoup(page.read()) 
    statements = soup.findAll ('p',{ "class" : "Last Statement:" }) 
    print statements 

csvfile.close() 
conn.commit() 
conn.close() 

Der Code ist etwas chaotisch, ich weiß. Sobald alles funktioniert, werde ich es aufräumen. Ein Problem allerdings. Ich versuche, alle Aussagen mit soup.findall zu bekommen, aber ich kann nicht scheinen, die Klasse richtig zu machen. Der relevante Teil der Seite Quelle sieht wie folgt aus:

<p class="text_bold">Last Statement:</p> 
<p>I don't have anything to say, you can proceed Warden Jones.</p> 

jedoch die Ausgabe von meinem Programm:

[] 
[] 
[] 

... Was genau das Problem sein könnte?

+0

Was ist das Problem genau? Die "letzten Statements" vom anderen Seiteninhalt trennen? –

+0

John Gordon: Nun, die Aussagen sind nicht in einer Tabelle. Überprüfen Sie diesen Link zum Beispiel: http://www.tdcj.state.tx.us/death_row/dr_info/vargakevinlast.html Ich verstehe nicht, wie man die letzten Aussagen jeder dieser Seiten ergreift. – Omnicron

+0

Sie könnten nach

Letzte Anweisung:

'suchen und dann die folgenden'

'... –

Antwort

0

Ich werde nicht Code schreiben, der das Problem löst, sondern gibt Ihnen einen einfachen Plan, wie es selbst zu tun:

Sie wissen, dass jede letzte Aussage unter der URL befindet:

http://www.tdcj.state.tx.us/death_row/dr_info/[lastname][firstname]last.html 

Sie sagen, Sie haben bereits alle anderen Informationen. Dazu gehört vermutlich die Liste der exekutierten Gefangenen. Also sollten Sie eine Liste von Namen in Ihrem Python-Code generieren. Dadurch können Sie die URL generieren, um zu jeder Seite zu gelangen, zu der Sie gelangen.

Dann erstellen Sie eine For-Schleife, die über jede URL mit dem oben angegebenen Format iteriert.

Schreiben Sie im Rumpf dieser for-Schleife Code, um die Seite zu lesen und die letzte Anweisung abzurufen. Die letzte Anweisung auf jeder Seite ist im gleichen Format auf jeder Seite, so können Sie das Parsen verwenden, das Teil zu erfassen, die Sie wollen:

<p class="text_bold">Last Statement:</p> 
<p>D.J., Laurie, Dr. Wheat, about all I can say is goodbye, and for all the rest of you, although you don&rsquo;t forgive me for my transgressions, I forgive yours against me. I am ready to begin my journey and that&rsquo;s all I have to say.</p> 

Sobald Sie Ihre Liste der letzten Aussagen haben, können Sie sie zu SQL schieben können .

So wird Ihr Code wie folgt aussehen:

import urllib2 
# Make a list of names ('Last1First1','Last2First2','Last3First3',...) 
names = #some_call_to_your_database 
# Make a list of URLs to each inmate's last words page 
# ('URL...Last1First1last.html',URL...Last2First2last.html,...) 
URLS =() # made from the 'names' list above 

# Create a dictionary to hold all the last words: 
LastWords = {} 

# Iterate over each individual page 
for eachURL in URLS: 
    response = urllib2.urlopen(eachURL) 
    html = response.read() 
    ## Some prisoners had no last words, so those URLs will 404. 
    if ...: # Handle those 404s here 

    ## Code to parse the response, hunting specifically 
    ## for the code block I mentioned above. Once you have the 
    ## last words as a string, save to dictionary: 
    LastWords['LastFirst'] = "LastFirst's last words." 



# Now LastWords is a dictionary with all the last words! 
# Write some more code to push the content of LastWords 
# to your SQL database. 
+0

Das sieht gut aus! Will hineinschauen. Vielen Dank! – Omnicron

+0

Viel Glück! Bitte upvote, wenn Sie es hilfreich finden! Veröffentlichen Sie genauere Fragen mit Beispielen Ihres Codes, während Sie loslegen :) – Cinghiale

+0

Ich tat, aber mein Ruf ist zu niedrig, um ihn öffentlich zu zeigen :) – Omnicron