使用 Pythons lxml text() 参数时如何在文本数据中包含 URL

How to include URL in textual data when using Pythons lxml text() argument

我正在尝试使用 lxml 库解析我收集的一些 HTML 数据。在大多数情况下,我已经成功地提取了我需要的值,但是我的代码似乎没有提取文本数据中的 URLS。下面的代码只是我遇到困难的特定值的一个示例。一些值似乎只是文本,而其他值是 href。是否有 text() 参数的替代方法,以便它包含来自 URL 的文本?

import lxml
import json
from lxml import etree
from lxml.html.clean import Cleaner
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

    with open('items.json') as data_file:    
    html = json.load(data_file)
    html_parser = lxml.etree.HTMLParser()

    for entry in html:
        url = str(entry.get('url', ''))
        field = str(entry.get('field1', ''))

        html_parsed = lxml.etree.parse(StringIO(field), html_parser)
        for table in html_parsed.xpath('//td/table'):
            for row in table.xpath('.//tr'):
                value = (row.xpath('.//td/text()'))
                    if "Homepage :" in value:
                        print(url)
                        print(value)

目前的结果示例:

示例 HTML 数据:

<td align="right">Homepage :</td><td align="left"><a href="http://www.example.com" target="_blank">www.example.com</a></td>

返回结果:

['Homepage :']

示例 HTML 数据:

<td align="right">Homepage :</td><td align="left">http://workingexample.com/</td>

返回结果:

['Homepage :', 'http://workingexample.com/']

非常感谢能够根据第二个示例获取所需数据的解决方案:)

首先,您正在检查文本 "Homepage" 的 td 不包含您之后的 URL,因此您只能使用它来验证您是否在正确的行中(稍后会详细说明为什么这是一个问题)。

其次,href是标签的一个属性。标签的 text() 只是屏幕上可见的内容,可以是任何内容。 如果要获取URL需要访问标签的属性,最简单的方法如下:

if "Homepage :" in value:
    url = row.xpath('.//td/a/@href')

@ 表示 hrefa 的属性,而不是 child。所以这将 return td.

中的 a 标签的 href

如果你在该行中有多个 a 标签,第一个问题现在可能是一个问题,我不是 xpath 专家,但我认为以下应该有效(这取代了 value = (row.xpath('.//td/text()'))):

.//td[text()[contains(.,'Homepage')]]/following-sibling::td[1]/a/@href

如果我没记错的话,它应该找到文本内容中包含 Homepagetd,然后找到 td 之后的第一个 ([1]) a 并从中获取 href 属性。