首页 > 解决方案 > Xpath - 当条件包含标签时检索文本值

问题描述

我有一个表的一部分,我正在尝试获取值“Distributor 10”

<table class="d">
    <tr>
        <td class="ah">supplier<td>
        <td class="ad">
            <a href="/S/3/143.html">Supplier 10</a>
        </td>
    </tr>
    <tr>
        <td class="ah">distributor<pre><td>
        <td class="ad">
            <a href="/D/3/143.html">Distributor 10</a>
        </td>
    </tr>
</table>

如果我在 Chrome 开发人员中,我会使用以下 xpath 字符串获取此值

//tr/td[text()="distributor]/following-sibling::td[@class="ad"]/a/text()

但是当我在 python 中编写代码时 - 它返回一个空列表......从我可以看到它是因为<pre>“分销商”旁边的标签当我修改上面提到的 xpath 以寻找“供应商”而不是分销商它工作非常好

欢迎大家提出意见

标签: python-2.7xpathgoogle-chrome-devtools

解决方案


假设您使用的是 lxml,您可以使用以下 XPath 之一来使其正常工作:

//tr[contains(.,"distributor")]//a/text()

//a[parent::td[@class="ad"] and starts-with(@href,"/D")]/text()

一段代码:

from lxml import etree
from io import StringIO
html = '''<table class="d">
    <tr>
        <td class="ah">supplier<td>
        <td class="ad">
            <a href="/S/3/143.html">Supplier 10</a>
        </td>
    </tr>
    <tr>
        <td class="ah">distributor<pre><td>
        <td class="ad">
            <a href="/D/3/143.html">Distributor 10</a>
        </td>
    </tr>
</table>'''

parser = etree.HTMLParser()
tree   = etree.parse(StringIO(html), parser)

data = tree.xpath('//tr[contains(.,"distributor")]//a/text()')
print (data)

输出 :['Distributor 10']

替代方法:使用 lxml html 清洁器类(“remove_tags”)从页面中删除 pre 元素。

参考 :


推荐阅读