【问题标题】:python lxml xpath: how to get this predicate workingpython lxml xpath:如何让这个谓词工作
【发布时间】: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


【解决方案1】:

你在第三个例子中的谓词(@href[contains(@href,"some_file")]),翻译成英文的意思是“在simple_record中找到一个节点,它有一个属性href,它本身有一个属性href,它的属性值包含字符串some_file"。这样的节点不存在,所以返回一个空的结果列表。

您打算用英语问的是“在simple_record 中找到一个具有href 属性的节点,该属性的值包含字符串some_file”(感谢@DanielHaley!)。翻译成xpath,你可以这样写

simple_xpath   = '@href[contains(.,"some_file")]'

. 现在指回被谓词过滤的上下文节点(即@href 属性本身)。该表达式将导致结果 3 与结果 1 相同。

【讨论】:

  • 我觉得你的英文翻译有点不对劲。我认为第一个更像是“找到一个href 属性,它本身有一个属性href,它的值包含字符串some_file”。第二个更像是“找到一个href 属性,其值包含字符串some_file”。
  • @DanielHaley - 你是对的!当您在没有足够咖啡的情况下进行翻译时会发生这种情况!将编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2016-03-06
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多