1

最近 Python を使い始めたばかりで、少し xPath で使用したいのですが、クエリの結果を出力すると [] しか取得できず、なぜ =S なのかわかりません。

    import libxml2, urllib


doc = libxml2.parseDoc(urllib.urlopen("http://www.domain.com/").read())
result = doc.xpathEval("//th//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//a")

if result != []:
    print result
elif result == "":
    print "null"
else:
    print result

doc.freeDoc()

[]だけでエラーは発生しません。どうなり得るか?また、libxml2 については、ここよりも優れたドキュメントがありますか? 非常に紛らわしいので =S


編集

コードを変更したので、[] よりも多くの情報が得られます。解析しようとしている html の非有効性に関連する次の出力が得られます (ただし、それは私のものではないため、変更できません)。 . Pythonにその事実をより寛容にするように指示する方法についてのアイデアはありますか?

^ エンティティ: 行 3552: パーサー エラー: タグ tr 行 209 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ tbody 行 208 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ テーブル行 207 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ入力行 206 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ入力行 205 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ フォーム行 204 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ テーブル行 99 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ div 行 98 のデータの早期終了

^ エンティティ: 行 3552: パーサー エラー: タグ本体行 96 のデータの途中終了

^ エンティティ: 行 3552: パーサー エラー: タグ html 行 3 のデータの途中終了

^ トレースバック (最新の呼び出しが最後): ファイル "C:\Python26\lib\site-packages\libxml2.py"、1263 行目、ret が None の場合は parseDoc 内:raise parserError('xmlParseDoc() failed') libxml2.parserError : xmlParseDoc() が失敗しました

実際にはもっと長いリストですが、すべてのエラーは無効な html が原因であるため、すべてをここに配置しても意味がありません。

4

3 に答える 3

1

XPath が要素を選択していない可能性があります。たとえば、th 内の td を探していますが、これらの要素はピアであり、入れ子にするべきではありません。

なぜ(count(preceding-sibling::*) + 1) = 2代わりに言うのcount(preceding-sibling::*) = 1ですか?

より単純な XPath を使用すると、期待どおりの結果が得られますか?

于 2009-11-07T21:21:55.797 に答える
0

thとtrを混同していますか?thをtrに変更します。

于 2009-11-08T15:15:02.270 に答える
0

補足: XPath の不必要な複雑さはどこから来るのでしょうか? これ:

//th//td[(((count(前の兄弟::*) + 1) = 2) and 親::*)]//a

次と同等です。

//th//td[count(前の兄弟::*) = 1)]//a

そしておそらく:

//th/td[2]//a
于 2009-11-09T10:33:24.103 に答える