gpt4 book ai didi

python - 告诉基于 contains() 的 XPath 查询在到达一个字母后停止?

转载 作者:行者123 更新时间:2023-11-27 23:32:03 25 4
gpt4 key购买 nike

我为给定的关键字抓取各种工作页面,并在有匹配项时提取标题和链接。

XPATH_MAPPING_SINGLE_PAGE = {'heading' : "//*[self::h2 or self::h3 or self::h4 or self::dt][contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '%s')]"}
XPATH_MAPPING_HYPERLINKS = {'href': "//a[contains(translate(normalize-space(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '%s')]/@href",
'text': "//a[contains(translate(normalize-space(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '%s')]"}

import urllib2
import urlparse

import lxml.html as lh

response = urllib2_urlopen(url)
content = response.read()
root = lh.fromstring(content)
titles_and_links = get_individual_job_titles_and_hyperlinks(root, keyword)

def get_individual_job_titles_and_hyperlinks(root, keyword):
texts = [element.text_content().strip() for element in root.xpath(XPATH_MAPPING_HYPERLINKS['text'] % keyword)]
hrefs = root.xpath(XPATH_MAPPING_HYPERLINKS['href'] % keyword)
return zip(texts, hrefs)

这工作相当可靠。然而对于像 https://www.gosquared.com/careers/ 这样的页面和关键字“工程师”,它提取了其中的单个工程工作,还提取了指向公司工程博客页面的链接:

>>print title_and_links
[('Engineering Blog', '//engineering.gosquared.com/'), ('Software Engineer', '/careers/software-engineer/'), ('Engineering Blog', '//engineering.gosquared.com/')]

这显然是因为我的 XPath 是基于 contains() 的。一旦它找到文本“Engineer”,它就会认为它是匹配的,因此解释了为什么“Engineering”链接也被选中。

如何修改我的 XPath 以使其不会产生这些误报?更新后的 XPath 需要知道在关键字结束后立即停止,并且可能需要一些标点符号(空格、连字符、句号、逗号等)而不是字母,从而仍然正确地选择链接文本,例如:

  • 工程师-机械
  • 化学家 - 制药
  • 医疗保健部门顾问
  • 等等

这是否可以纯粹使用 XPath 来完成,而无需添加正则表达式来预期标点符号或空格?

最佳答案

我假设我们不能依赖页面上可能出现职位的任何特定部分。

但是,我很确定,您可以避免查看 headerfooter 元素。检查 parent :

//*
[self::h2 or self::h3 or self::h4 or self::dt]
[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '%s')]
[not(ancestor::footer) and not(ancestor::header)]

在这种特殊情况下,这有助于不匹配 Engineering Blog,因为它位于页脚中。

关于python - 告诉基于 contains() 的 XPath 查询在到达一个字母后停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com