2

抽出したいテキストの xpath は、ツリーの奥深くに確実に配置されています。

...table/tbody/tr[4]/td[2]

具体的には、td[2] は次のように構成されています。

<td class="val">xyz</td>

テキスト「xyz」を抽出しようとしていますが、広範な検索では複数の結果が返されます。たとえば、次のパスは 10 個の要素を返します。

xpath('//td[@class="val"]')

...特定の検索では要素が返されません。以下が何も返さない理由がわかりません。

xpath('//tbody/tr/td[@class="val"]')

1つの解決策には..

table = root.xpath('//table[@class="123"]')

#going down the tree
xyz = table[0][3][1]
print vol.text

ただし、これは非常に脆弱であると確信しています。脆くなく、リソースが比較的安価なxpath検索を構築する方法を誰かが教えてくれれば幸いです

4

3 に答える 3

2
...table/tbody/tr[4]/td[2]

この XPath は、Firebug などのツールを介して見つけたと思います。Firebug (またはブラウザー内の他の検査ツール) などのツールについて注意すべき点は、ブラウザー自体によって生成された DOM ツリーを使用し、ブラウザーのほとんどの (すべてではないにしても) HTML パーサーが、渡された HTML を有効にしようとすることです。これには、多くの場合、標準で規定されているさまざまなタグを追加する必要があります。

<tbody>はこれらのタグの 1 つです。タグは、またはタグ<tr>の子としてのみ許可されます。<thead><tbody><tfoot>残念ながら、私の経験では、これらのタグのいずれかが<table>実際のソース内にあることはめったにありませんが、標準では HTML を有効にする必要があるため、ブラウザーは解析中にこれらの必要なタグを追加します

この話を簡単に<tbody>言うと、実際のソースにはおそらくタグがありません。そのため、XPath は何も返しません。

XPath クエリの生成に関しては、これは特定のページ/xml に大きく依存します。一般に、 のような位置クエリtd[4]は、前に何かが追加されると簡単に壊れる傾向があるため、最後の手段にする必要があります。マークアップを注意深く調べて、idorのような属性を使用するクエリを作成するようにしてくださいclass。これは、位置的なものより確実に具体性を追加するためです。しかし、最終的には、問題のページの詳細にすべてが集約されます。

于 2012-05-02T21:17:39.750 に答える
2

明示的に言及していませんが、ターゲットクラスtabletdタグ クラスが信頼できる場合は、次のようなことができます。

//table[@class="123"]/descendant::td[@class="val"]

そして、あなたはそこにいるかどうかの問題を半分回避しますtbody

ただし、XPATHクエリを推奨するために解析しようとしている資料を実際に見ることに代わるものはありません...

于 2012-05-02T22:07:52.360 に答える
1

これは機能しているようです

from lxml import etree

doc = etree.HTML('<html><body><table><tbody><tr><td>bad</td><td class="val">xyz</td></tr></tbody></table></body></html>')
print doc.xpath('//tbody/tr/td[@class="val"]')[0].text

出力:

xyz

それで、あなたの問題は何ですか?

于 2012-05-02T18:09:33.433 に答える