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")]]')

但这给了我所有的表格元素。我只想要一个包含此文本的表。我了解发生了什么,但除了打破一些讨厌的正则表达式之外,我很难弄清楚如何做到这一点。有什么想法吗?

4

4 回答 4

3

使用

//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"]选择带有 text 的文档中任意位置的元素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 回答