<meta name="GENERATOR" content="snanail Version"> <meta name="GENERATOR" content="snanail Version"> <meta name="GENERATOR" content="snanail Version" />

Python: Чаму Xpath, здавалася б, толькі апрацоўка першага элемента ў гэтым дрэве?

Выкажам здагадку, што ў мяне ёсць гэта:



<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 адказы

Выкарыстанне HTML-файл прыкладу, і гэты скрыпт:

from lxml import etree

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

дае:

['001.html', '002.html']
1
дададзена

вы спрабавалі абвясціць дакумент у XHTML?

тып дакумента, у пачатку вашага прыкладу кажа, што вы карыстаецеся HTML, які не зьяўляецца сапраўдным XML, такім чынам, XML-парсер, хутчэй за ўсё, перастане апрацоўваць ўвод толькі пасля DOCTYPE. памятаеце, што XPath неабходны правільны ўвод xml для таго, каб працаваць.

не так, калі вы выкарыстоўваеце XHTML доктайп, то xml парсер не будзе больш парушаць на DOCTYPE, і разабраць ўваход ва ўсёй яго паўнаце.

0
дададзена
На самай справе XPath не патрабуецца сапраўдны (ці нават добра сфармаваны) ўвод xml для таго, каб працаваць, ён павінен толькі асобнік мадэлі дадзеных XDM, і гэта, вядома, магчыма для HTML-парсер, каб паставіць гэта. Але, вядома, калі вы паставіце HTML праз xml парсер вы, верагодна, трапіў непрыемнасці.
дададзена аўтар Michael Kay, крыніца