【问题标题】:I am confused why this XPath selector does not work我很困惑为什么这个 XPath 选择器不起作用
【发布时间】:2020-10-18 08:02:55
【问题描述】:

我正在学习使用 scrapy 并使用 XPath 选择器,并决定通过从 craigslist 中抓取职位名称来练习。

这是我试图从 craigslist 页面中抓取职位名称的单个职位链接的 html:

<a href="https://orangecounty.craigslist.org/sof/d/trabuco-canyon-full-stack-net-developer/7134827958.html" data-id="7134827958" class="result-title hdrlnk">Full Stack .NET C# Developer (Mid-Level, Senior) ***LOCAL ONLY***</a>

我想做的是用类结果标题检索所有相似的 a 标签,所以我使用了 XPath 选择器:

titles = response.xpath('//a[@class="result-title"/text()]').getall()

但我收到的输出是一个空列表:[]

我能够直接从 Chrome 的检查器复制 XPath,它最终运行良好,并为我提供了完整的职位名称列表。这个选择器是:

titles = response.xpath('*//div[@id="sortable-results"]/ul/li/p/a/text()').getall()

我知道为什么第二个 XPath 选择器有效,但我不明白为什么我的第一次尝试无效。有人可以向我解释为什么我的第一个 XPath 选择器失败了吗?如果有帮助/有必要,我还提供了指向下面 craigslist 页面的完整 html 的链接。我是scrapy的新手,想从我的错误中吸取教训。谢谢!

查看来源:https://orangecounty.craigslist.org/search/sof

【问题讨论】:

  • 因为您的a 元素有多个类,@class="result-title" 测试将失败。相反,您需要检查类是否包含结果标题。
  • 谢谢!您的评论与下面的答案一起帮助我解决了我的困惑。

标签: python html xpath web-scraping scrapy


【解决方案1】:

像这样:

'//a[contains(@class,"result-title ")]/text()'

或者:

'//a[starts-with(@class,"result-title ")]/text()'

我使用contains()starts-with() 因为a 节点的类是

result-title hdrlnk

不只是

result-title

在您的 XPath 中:

'//a[@class="result-title"/text()]'

即使类是result-title,语法错误,你应该使用:

'//a[@class="result-title"]/text()'

【讨论】:

  • 谢谢你,这对我来说很有意义。我在另一篇文章中看到使用 contains() 函数解决了类似的问题,但我不明白为什么,也没有意识到这也是我的问题的解决方案。我也没有意识到我可以使用 starts-with() 函数来识别元素的类。感谢您的回复!
【解决方案2】:

只需'//a[@class="result-title hdrlnk"]/text()'

需要 2 个修复:

  • /text()[] 之外
  • “result-title hdrlnk”不仅是属性选择中的“result-title”,因为 XPath 是 XML 解析而不是 CSS;所以需要准确的属性内容来匹配。

【讨论】:

  • 你测试了吗?不工作。应该属于评论
  • 我在实际发布之前尝试过这个,但它对我不起作用。不过还是谢谢!
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多