Python: Waarom lijkt Xpath alleen het eerste element in deze boom te verwerken?

Stel dat ik dit heb:



<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="snanail Version 2.18">
<title>-www.example.org-</title>

</head>
<body>
<table BORDER="0" CELLSPACING="1" CELLPADDING="6" ALIGN="CENTER"> <tr> <td WIDTH="100"> <table ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1"> <tr> <td HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE"> 001_thumb.png </td> </tr> <tr> <td HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE"> 001.jpg
300 x 300 (806 KB)
</td> </tr> </table> </td> <td WIDTH="100"> <table ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1"> <tr> <td HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE"> 002_thumb.png </td> </tr> <tr> <td HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE"> 002.jpg
300 x 300 (627 KB)
</td> </tr> </table> </td> </tr> </table>
 
</html>

And I want to find all the urls in the page, and do:

tree = lxml.html.parse('example.html')
links = tree.xpath('//a/@href')

Yet I only get the first one (001.html). Why is that? I've tried manually iterating over tree after using getroot() and it seems only the first table with the first url is visible. I don't understand.

Edit: I tested again with the example I posted and it actually worked, and after some testing, it seems as if I remove the head, it works... Maybe something in it is breaking the parser? I dunno. I guess the best way to solve this would be to search the file and remove anything between the <head> and </head>? Since I can't parse it due to the parse not working as expected. So I've added the head to the example for it to break.

2

2 antwoord

Het voorbeeld HTML-bestand en dit script gebruiken:

from lxml import etree

parser = etree.HTMLParser(encoding='utf8')
tree = etree.parse('source.html', parser)
print tree.xpath('//a/@href')

geeft:

['001.html', '002.html']
1
toegevoegd

heb je geprobeerd je document te declareren als XHTML?

het doctype aan het begin van uw voorbeeld vertelt dat u HTML gebruikt, wat geen geldige xml is, dus een xml-parser zal waarschijnlijk de invoer stoppen net na het doctype. onthoud dat XPath een geldige XML-invoer nodig heeft om te kunnen werken.

dus, als u een doctype van XHTML gebruikt, zou de XML-parser niet meer breken over het doctype en de invoer in zijn geheel parseren.

0
toegevoegd
Eigenlijk heeft XPath geen geldige (of zelfs goedgevormde) XML-invoer nodig om te kunnen werken, het heeft alleen een exemplaar van het XDM-gegevensmodel nodig en het is natuurlijk mogelijk dat een HTML-parser dat oplevert. Maar zeker als u HTML door een XML-parser plaatst, zult u waarschijnlijk problemen ondervinden.
toegevoegd de auteur Michael Kay, de bron