2016-12-09 1 views
0

Warum geben die folgenden zwei Code-Snippets unterschiedliche Ausgaben? Der einzige Unterschied zwischen ihnen besteht darin, dass das h1-Tag im ersten Fall im zweiten Fall durch ein h-Tag ersetzt wird. Ist das, weil das h1 Tag eine spezielle "Bedeutung" in HTML hat? Ich versuchte mit h1 durch h6 und alle von ihnen geben [] als Ausgabe, während mit h7 es anfängt, [u'xxx'] als Ausgang zu geben.Verhalten des Scrapy-Xpath-Selektors auf h1-h6-Tags

from scrapy import Selector # scrapy version: 1.2.2 

text = '<h1><p>xxx</p></h1>' 
print Selector(text=text).xpath('//h1/p/text()').extract() 
Output[1]: [] 

text = '<h><p>xxx</p></h>' 
print Selector(text=text).xpath('//h/p/text()').extract() 
Output[2]: [u'xxx'] 

Antwort

3

Einschließlich Tags innerhalb h# ist ungültig nach W3C. Sie können mehr über diese here

Wie auch immer, sehen dies umgehen und nur mit jeder xml Struktur arbeiten Sie gerade die type wie folgt ändern:

sel = Selector(text="anyxml", type="xml") 

Diese jede XML-Struktur respektieren.

1

Kurze Antwort ist, dass h1 .. h6 nicht <p> in wohlgeformten HTML-Dokumenten, zumindest lxml enthalten soll (die Kräfte Scrapy Selektoren) nicht so, wenn die HTML-Analyse. Lxml behandelt schlechte Formatierung, aber dieses Fall ein bisschen anders.

können Sie überprüfen, wie lxml Parsen und serialisiert die HTML-Snippet zurück:

>>> from scrapy import Selector 
>>> text = '<h1><p>xxx</p></h1>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h1></h1><p>xxx</p></body></html> 

Also, wenn lxml begegnet den p Tag innerhalb der h1, es es nach ausdrückt. Das Element ist nicht verloren, aber es ist nicht, wo Sie es erwarten würden, wenn Sie die HTML-Quelle lesen.

vs anderen Schnipsel:

>>> text = '<h><p>xxx</p></h>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h><p>xxx</p></h></body></html> 
>>> 

h Elemente bedeuten nichts Besonderes für lxml, so "p innerhalb h" ist ok.

+0

Vielen Dank für die Anzeige, dass Druck (s.extract()) erzählt, was unter der Haube ist! – FJDU

Verwandte Themen