2016-07-30 11 views
0

Dies ist der Code, den ich alle Elemente iterieren bin mit:Schöne Suppe ist die Auswahl kein Element

soup_top = bs4.BeautifulSoup(r_top.text, 'html.parser') 

selector = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 

for link in soup_top.select(selector): 
    print(link) 

Das gleiche Wähler eine Länge von 57 gibt, wenn in JavaScript verwendet:

document.querySelectorAll("#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a").length; 

Ich dachte, dass ich den Inhalt der Webseite vielleicht nicht richtig finde. Ich habe dann eine lokale Kopie der Webseite gespeichert, aber der Selektor in Beautiful Soup hat immer noch nichts ausgewählt. Was geht hier vor sich?

Dies ist die website Ich verwende den Code auf.

+0

Können Sie den HTML-Code teilen? Ohne es wird es ziemlich schwer sein zu sehen, was vor sich geht. –

+0

Wie bereits erwähnt, haben wir keine Ahnung, ohne die html –

+0

@Kristof Ich habe einen Link zur Website hinzugefügt, ich versuche zu kratzen. –

Antwort

0

Es scheint, dass dies aufgrund der verwendeten parser (d. H. html.parser) ist. Wenn ich die gleiche Sache mit lxml als Parser versuchen:

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.swapnilpatni.com/law_charts_final.php' 
r = requests.get(url) 
r.raise_for_status() 

soup = BeautifulSoup(r.text, 'lxml') 

css_select = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 
links = soup.select(css_select) 
print('{} link(s) found'.format(len(links))) 

>> 1 link(s) found 

for link in links: 
    print(link['href']) 

>> spadmin/doc/Company Law amendment 1.1.png 

Die html.parser ein Ergebnis zurück, bis #ContentPlaceHolder1_gvDisplay table tr, und selbst dann gibt es nur die ersten tr.

Wenn die URL durch W3 Markup Validation Service ausgeführt wird, dann ist dies der Fehler, der zurückgegeben wird:

Sorry, ich bin nicht auf dieses Dokument zu validieren, da auf der Leitung 1212 es ein oder mehrere Bytes enthalten, die ich nicht als utf interpretieren kann -8 (mit anderen Worten, die gefundenen Bytes sind keine gültigen Werte in der angegebenen Zeichencodierung). Bitte überprüfen Sie sowohl den Inhalt der Datei als auch die Zeichencodierung. Der Fehler war: UTF-8 „\ xA0“ Karte nicht für Unicode

Es ist wahrscheinlich, dass die html.parser auf diese Drosseln als auch, während lxml fehlertoleranter ist.

+0

Danke kristof :) Ist es generell besser, 'lxml' anstelle von' html.parser' zu verwenden? –

+0

Nun, wie Sie in der Vergleichstabelle in der Dokumentation sehen können, ist 'lxml' schnell (wie in C geschrieben) und sehr nachsichtig. Persönlich benutze ich immer "lxml", aber der Nachteil ist, dass es eine zusätzliche externe Abhängigkeit in Ihr Projekt einführt. –

+0

Ich habe den Fehler 'Konnte keinen Baum Builder mit den Funktionen finden, die Sie angefordert haben: lxml'. Ich schätze, das ist, was du mit äußerer Abhängigkeit meintest. Wie kann ich es lösen? –