Python 我不明白为什么这个XPath选择器不起作用
我正在学习使用scrapy和使用XPath选择器,并决定通过从craigslist中删除职务来进行练习 以下是我试图从craigslist页面中获取工作标题的单个工作链接的html:Python 我不明白为什么这个XPath选择器不起作用,python,html,xpath,web-scraping,scrapy,Python,Html,Xpath,Web Scraping,Scrapy,我正在学习使用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=
<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>
但我收到的输出是一个空列表:[]
我能够直接从Chrome的inspector复制XPath,它最终工作得非常完美,并给了我一个完整的职位名称列表。该选择器是:
titles = response.xpath('*//div[@id="sortable-results"]/ul/li/p/a/text()').getall()
我可以理解为什么第二个XPath选择器可以工作,但我不理解为什么我的第一次尝试没有工作。有人能解释为什么我的第一个XPath选择器失败吗?我还为下面的craigslist页面提供了完整html的链接,如果有帮助/必要的话。我是个新手,想从错误中吸取教训。谢谢大家!
查看来源:https://orangecounty.craigslist.org/search/sof简单地'//a[@class=“result title hdrlnk”]/text()'
需要2个修复程序:
在/text()
[]
- “result title hdrlnk”不仅仅是属性选择中的“result title”,因为XPath是XML解析而不是CSS;因此需要精确的属性内容来匹配
- 像这样:
'//a[contains(@class,"result-title ")]/text()'
或:
我使用contains()
或start-with()
,因为a
节点的类是
result-title hdrlnk
不只是
result-title
在XPath中:
'//a[@class="result-title"/text()]'
即使类是结果标题
,语法也是错误的,您应该使用:
'//a[@class="result-title"]/text()'
这回答了你的问题吗?由于
元素有多个类,因此@class=“result title”
测试将失败。相反,您需要检查类是否包含结果标题。谢谢!你的评论和下面的答案帮助我解决了困惑。你测试过吗?不工作。应该属于一个评论,我在发帖之前就试过了,但它对我不起作用。不过还是要谢谢你!谢谢你,我现在明白了。我在另一篇文章中看到,使用contains()函数修复了一个类似的问题,但我不明白为什么,也没有意识到这也是我问题的解决方案。我也没有意识到我可以使用start-with()函数来标识元素的类。谢谢你的回复!
'//a[@class="result-title"/text()]'
'//a[@class="result-title"]/text()'