4

こんにちはすべて私はxpathの問題に起因すると思ういくつかの問題を抱えています。lxmlパッケージのhtmlモジュールを使用して、いくつかのデータを取得しようとしています。私は以下で最も単純化された状況を提供していますが、私が使用しているhtmlははるかに醜いことを覚えておいてください。

<table>
    <tr>
    <td>
        <table>
            <tr><td></td></tr>
            <tr><td>
                <table>
                    <tr><td><u><b>Header1</b></u></td></tr> 
                    <tr><td>Data</td></tr>
                </table>
            </td></tr>
        </table>
     </td></tr>
</table>

私が本当に必要としているのは、ヘッダーテキスト「Header1」があるため、深くネストされたテーブルです。私はそのようにしようとしています:

from lxml import html
page = '...'
tree = html.fromstring(page)
print tree.xpath('//table[//*[contains(text(), "Header1")]]')

しかし、それは私にすべてのテーブル要素を与えます。このテキストを含む1つのテーブルが必要です。私は何が起こっているのか理解していますが、いくつかの厄介な正規表現を破る以外に、これを行う方法を理解するのに苦労しています。何かご意見は?

4

4 に答える 4

3

Use:

//td[text() = 'Header1']/ancestor::table[1]
于 2010-04-14T13:04:24.663 に答える
2
于 2010-04-14T08:47:30.070 に答える
0

おそらくこれはあなたのために働くでしょう:

tree.xpath("//table[not(descendant::table)]/*[contains(., 'Header1')]")

このnot(descendant::table)ビットにより、最も内側のテーブルを確実に取得できます。

于 2010-04-14T05:48:14.100 に答える
0
table, = tree.xpath('//*[.="Header1"]/ancestor::table[1]')
  • //*[text()="Header1"]テキストを含むドキュメント内の任意の場所の要素を選択しますHeader1
  • ancestor::table[1]である要素の最初の祖先を選択しtableます。

完全な例

#!/usr/bin/env python
from lxml import html

page = """
<table>
    <tr>
    <td>
        <table>
            <tr><td></td></tr>
            <tr><td>
                <table>
                    <tr><td><u><b>Header1</b></u></td></tr> 
                    <tr><td>Data</td></tr>
                </table>
            </td></tr>
        </table>
     </td></tr>
</table>
"""

tree = html.fromstring(page)
table, = tree.xpath('//*[.="Header1"]/ancestor::table[1]')
print html.tostring(table)
于 2010-04-14T06:05:19.520 に答える