【问题标题】:Scrapy returns entire webpage starting at css selectorScrapy 从 css 选择器开始返回整个网页
【发布时间】:2022-01-19 03:12:35
【问题描述】:

我正在抓取博客文章并遇到了一个奇怪的问题。当提取整个元素而不是仅提取文本时,scrapy 将返回所选元素 + 网页中紧随其后的每个元素/结束标记。例如,我有这样的代码:

import scrapy


class postscraperSpider(scrapy.Spider):
    name = 'postscraper'
    allowed_domains = ['example.com']
    start_urls = ['https://www.example.com/blog-post/']

    def parse(self, response):
        yield{
            'title': response.css('.title_container > h1.entry-title::text').get(),
            'content': response.css('div.text_1 .text_inner h2').get()
        }

运行时,标题会填充正确的文本。但是,内容由正确的响应填充,然后是每个元素和后面的结束标记。

如果我尝试提取文本,它会很好地填充。像这样:

    def parse(self, response):
        yield{
            'title': response.css('.title_container > h1.entry-title::text').get(),
            'content': response.css('div.text_1 .text_inner h2::text').get()
        }

我不能只提取文本的原因是因为我从 text_inner 中提取的不仅仅是 h2s。我需要提取所有孩子,包括他们的标签。我真正需要的是看起来像这样的代码,但我觉得上面更好地说明了我的问题:

    def parse(self, response):
        yield{
            'title': response.css('.title_container > h1.entry-title::text').get(),
            'content': response.css('div.text_1 .text_inner > *').get()
        }

感谢您提供的任何帮助。

相关:No text printed when using response.xpath() or response.css in scrapy

还相关: Python: Scrapy returning all html following element instead of just html of element

看起来这是一个环境错误。我将尝试重新安装 Anaconda。

【问题讨论】:

  • 如果您选择的所有元素都是类为.text_inner 的元素的子元素,您可以尝试'content': response.css('div.text_1 .text_inner > *').getall()。如果您要选择的元素是类为.text_inner 的元素的兄弟元素,那么您可以尝试使用'content': response.css('div.text_1 .text_inner + *').getall()。如果没有您正在查看的实际 html,我将无能为力。
  • 这实际上是我正在使用的 css,并且遇到了同样的问题。最奇怪的部分是 scrapy 的 shell 能够使用我的选择器并准确返回我想要的。只有当我将该选择器添加到我的代码中时,才会出现此错误。如果有帮助,我正在抓取的网页是 jetlinx.com/150-years,需要的元素是 div.et_pb_text_1 > .et_pb_text_inner > *

标签: python web-scraping scrapy


【解决方案1】:

也许您可以尝试使用 .extract_first() 实例而不是 .get()。由于数组中的示例网站,很难判断您的 CSS 选择器是否正确。尝试转到 chrome 并搜索您使用的 CSS 选择器,看看它是否返回所有结束标记和元素。

【讨论】:

  • extract_first() 存在同样的问题。我几乎肯定 CSS 选择器是正确的。转到 chrome,我可以使用我的选择器完美地选择该元素。它只返回我正在寻找的元素。去scrapy的shell,我得到了完全相同的结果。选择器有效,scrapy 能够为我提供我正在寻找的确切元素。如果有帮助,我正在抓取的网站是 jetlinx.com/150-years,所需的元素是 div.et_pb_text_1 > .et_pb_text_inner > *
【解决方案2】:

重新安装 python + anaconda 为我解决了这个问题。我不确定发生了什么。我确实安装了 python 3.8 和 3.9,所以这可能是它们之间的冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多