Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我不明白为什么这个XPath选择器不起作用_Python_Html_Xpath_Web Scraping_Scrapy - Fatal编程技术网

Python 我不明白为什么这个XPath选择器不起作用

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=

我正在学习使用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>
但我收到的输出是一个空列表:[]

我能够直接从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()'