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として宣言しようとしましたか?

あなたの例の冒頭にあるdoctypeは、あなたが有効なXMLではないHTMLを使っていることを示しているので、XMLパーサーはdoctypeの直後に入力の処理を止めるでしょう。 XPathには有効なXML入力が必要であることを覚えておいてください。

したがって、XHTMLのdoctypeを使用すると、XMLパーサーはdoctypeを破棄せず、入力全体を解析します。

0
追加された
実際にXPathは動作するためには有効な(または整形式の)XML入力を必要とせず、XDMデータモデルのインスタンスのみが必要であり、HTMLパーサーがそれを提供することはもちろん可能です。しかし、確かにHTMLをXMLパーサーに置くと、問題が発生する可能性があります。
追加された 著者 Michael Kay,