2012-05-02 34 views
1

私は具体的Pythonは、特定の検索

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

で確実ツリー内の深い位置して抽出するテキストのXPath深いネストとのXPath LXML、TD [2]を

<td class="val">xyz</td> 
ように構成されています

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

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

...特定の検索は、任意の要素を返しませんが。 次のものが何も返さない理由は不明です。

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

一つの解決策は、しかし、私は非常にもろく、このかなり確信しています。..

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

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

を必要とします。誰かが作業する方法を非脆性とリソース

+3

はあなただけでテストするために、いくつかの有効なXMLを貼り付けることができますを見て、代わりに '与えるための代替はありません...テーブル/ tbody/... ' –

+1

サンプルXMLドキュメントを提供してください。例えば10行以上の場合は、[pastebin.com](http://pastebin.com)または[gist](https://gist.github.com/) – phihag

+1

にアップロードするか、 XML文書をPythonコードで使用して問題を示すサンプルのPythonコードを貼り付け、貼り付けをコピーしてコードを実行して問題を確認したい私の答えに似た何か –

答えて

0

あなたは明示的に言及していないが、あなたのターゲットtabletdタグクラスが信頼されている場合は、あなたのような何かを行うことができます:

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

をそして、あなたは半分tbodyの問題があったりでないというかわします。

しかし、実際にはXPathクエリを推薦するために解析しようとしている材料...

1

これはそうでは比較的安価で、両方のだろうXPathの検索を構築するために私に言うことができれば、私はそれをお願い申し上げます

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 

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

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

私はあなたがFirebugのようなツールを使用して、このXPathを見つけ思います。 (ブラウザ内のツールを検査または他の)Firebugのようなツールで1つ注意することは、彼らは、ブラウザ自体によって生成されたDOMツリーを使用して、ブラウザで最も(すべてではない)HTMLパーサが渡されたHTMLが有効にするために、ハードしようとするだろうということです。これは、多くの場合、標準が指示するさまざまなタグを追加する必要があります。

<tbody>は、これらのタグの1つです。 <tr> tags are only allowed as a child of <thead>, <tbody> or <tfoot> tags.残念ながら、私の経験では、あなたはめったに実際のソースで<table>内部のこれらのタグのいずれかが表示されませんが、standard requires to do so以来、有効なHTMLを作成する解析中のブラウザでは、これらの必要なタグを追加します。

この話を簡潔にするために、実際のソースには<tbody>タグはおそらくありません。そのため、XPathは何も返しません。 XPathクエリを生成するように

、これは非常に特定のページ/ XMLに依存します。一般に、td[4]のような位置情報照会は、それらの前に何かが追加されたときに簡単に壊れる傾向があるため、最後の手段である必要があります。あなたは慎重にマークアップを検査し、彼らはより確実な位置のものよりも特異性を追加するため、idまたはclassなどの属性を使用してクエリを思い付くしようとする必要があります。しかし、結局のところ、それは問題のページの詳細に至るまで続く。

+1

あなたのポイントに少し強調を加えることができます:*ソースに 'tbody'がありません。* – MattH

+0

@MattH:良いアイデア。しましょう。 – Avaris

関連する問題