2016-06-27 22 views
1

Hier mit speziellem Tag zu finden, ist die Website, die ich Parsen bin: http://uniapple.net/usaddress/address.php?address1=501+10th+ave&address2=&city=nyc&state=ny&zipcode=10036&country=USBeautifulSoup

ich das Wort zu finden, in der Lage sein möchte, die in der Leitung 39 zwischen den td-Tags sein werden. Diese Zeile sagt mir, ob die Adresse privat oder geschäftlich ist, was ich für mein Skript benötige.

Hier ist, was ich habe, aber ich bin immer diese Fehlermeldung:

AttributeError: 'NoneType' object has no attribute 'find_next' 

Der Code Ich verwende ist:

from bs4 import BeautifulSoup 
import urllib 


page = "http://uniapple.net/usaddress/address.php?address1=501+10th+ave&address2=&city=nyc&state=ny&zipcode=10036&country=US" 
z = urllib.urlopen(page).read() 
thesoup = BeautifulSoup(z, "html.parser") 
comres = (thesoup.find("th",text=" Residential or ").find_next("td").text) 
print(str(comres)) 
+0

Das bedeutet nur, dass der soup.find („th“, text = „Wohn oder ") gibt nichts zurück – SAMO

+0

Ändert sich die Reihenfolge der Header? –

Antwort

1

text Argument würde in diesem speziellen Fall nicht funktionieren. Dies hängt damit zusammen, wie die .string property eines Elements berechnet wird. Stattdessen würde ich einen search function verwenden, wo man tatsächlich get_text() anrufen können und die komplette „text“ eines Elements einschließlich der Kinder-Knoten:

label = thesoup.find(lambda tag: tag and tag.name == "th" and \ 
           "Residential" in tag.get_text()) 
comres = label.find_next("td").get_text() 
print(str(comres)) 

Drucke Commercial.

Wir können ein wenig weiter gehen und eine wiederverwendbare Funktion machen einen Wert von Label zu erhalten:

soup = BeautifulSoup(z, "html.parser") 

def get_value_by_label(soup, label): 
    label = soup.find(lambda tag: tag and tag.name == "th" and label in tag.get_text()) 
    return label.find_next("td").get_text(strip=True) 


print(get_value_by_label(soup, "Residential")) 
print(get_value_by_label(soup, "City")) 

Drucke:

Commercial 
NYC 
+0

Das hat funktioniert! Ich danke dir sehr! – Harrison

1

Alles, was Sie ist ein bisschen Housekeeping fehlen:

ths = thesoup.find_all("th") 
for th in ths: 
    if 'Residential or' in th.text: 
     comres = th.find_next("td").text 
     print(str(comres)) 
     >> Commercial 
+0

Das hat auch funktioniert! Vielen Dank! – Harrison

-1

Sie werden einen regulären Ausdruck verwenden müssen als Ihr Textfeld, wie re.compile('Residential or'), anstelle einer Zeichenfolge.

Das funktionierte für mich. Ich hatte über die Ergebnisse iterieren vorgesehen, obwohl, wenn Sie nur ein einziges Ergebnis pro Seite erwarten Sie find für find_all tauschen könnten:

for r in thesoup.find_all(text=re.compile('Residential or')): 
    r.find_next('td').text