【发布时间】:2019-08-03 08:29:21
【问题描述】:
早安,
最近我把 python 和网络抓取作为一种爱好......
我正试图解决 python lxml 和 xpath 谓词的问题,但可惜 - 显然在 stackoverflow 上没有类似的东西。所以我设法在下面的代码中重现,希望有人能看到我没有看到的东西......
有人可以解释为什么 Result3 是一个空列表吗? 我期待 Result3 与 Result1 相同。
我怎样才能实现 Result3 = Result1 ?
版本:Python 3.7.3、lxml 4.4.0(使用 pip 安装,而不是 Christoph Gohlke 的二进制文件)在 AMD Windows 机器上。
提前致谢!
史蒂夫
import lxml.html
simple_record = """<a href="some_map/some_file.png">dododo</a>"""
tree = lxml.html.fromstring(simple_record)
simple_xpath = "@href"
found_field = tree.xpath(simple_xpath)
print("Result1 = {}".format(found_field))
simple_xpath = """contains(@href,"some_file")"""
found_field = tree.xpath(simple_xpath)
print("Result2 = {}".format(found_field))
simple_xpath = """@href[contains(@href,"some_file")]"""
found_field = tree.xpath(simple_xpath)
print("Result3 = {}".format(found_field))
实际输出:
Result1 = ['some_map/some_file.png']
Result2 = True
Result3 = []
预期输出:
Result1 = ['some_map/some_file.png']
Result2 = True
Result3 = ['some_map/some_file.png']
【问题讨论】:
-
您的第三个 XPath 应该是 """@href[contains(.,"some_file")]""" 因为您对 @href 的第一次引用使其成为上下文。未经测试,因为我没有可用的 lxml。
-
contains()函数与starts-with()函数的语义不同。没有输入样本,问题中的其他所有内容都毫无意义。 -
@Alejandro 感谢您指出这一点,
starts-with()的使用是剩余的,我更新了我的帖子。
标签: python xpath lxml predicate