【问题标题】:Python Sprapy - CSS Selector - Why using .get() intead .extractPython Scrapy - CSS 选择器 - 为什么使用 .get() 而不是 .extract
【发布时间】:2020-06-30 00:36:17
【问题描述】:

首先感谢大家的支持,这个社区给了一个老人,但是一个 Python 新手。谢谢。

我正在做一门课程,我试图理解代码的每个单词。如果有什么不清楚的地方,我会寻找答案。

我阅读了scrapy documentation,但不明白为什么使用.get() 而不是其他选项。

我正在做一个 scrapy spider。现在正在获取下一页

问题:为什么 .get()

next_page = response.css('li.next a::attr(href)').get()

我期待

next_page = response.css('li.next a::attr(href)')

或者...

next_page = response.css('li.next a::attr(href)').extract()

这是 HTML 代码

HTML 代码只是为了清除信息。您可以访问quotes.toscrape.com

<li class="next">
    <a href="/page/2/">
    "Next "
        <span aria-hidden="true">→</span>
    </a>
</li>

这是我的完整蜘蛛代码

我认为社区不需要这个,但想尽可能提供更多信息。谢谢。

import scrapy
from ..items import QuotetutorialItem

class QuoteSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com'
    ]

    def parse(self, response):
        items = QuotetutorialItem()
        all_div_quotes = response.css('div.quote')
        for quotes in all_div_quotes:

            title = quotes.css('span.text::text').extract()
            author = quotes.css('.author::text').extract()
            tag = quotes.css('.tag::text').extract()

            items['title'] = title
            items['author'] = author
            items['tag'] = tag

            yield items

        next_page = response.css('li.next a::attr(href)').get()

        if next_page is not None:
            yield response.follow(next_page, callback= self.parse)

非常感谢。

抱歉又问了一个愚蠢的问题。

如果这篇文章对 Stack Overflow 更好,我可以删除它。

【问题讨论】:

    标签: python scrapy css-selectors


    【解决方案1】:

    来自文档

    如果您是 Scrapy 的老用户,您可能熟悉 .extract() 和 .extract_first() 选择器方法。许多博客文章和教程也在使用它们。 Scrapy 仍然支持这些方法,没有计划弃用它们。 但是,现在使用 .get().getall() 方法编写 Scrapy 使用文档。我们认为这些新方法可以使代码更加简洁易读。

    如果您不使用get()getall()extract()extract_first(),那么您只有一个查询。
    例如:

    response.css('li.next a::attr(href)') 告诉你想要得到什么。这是一个查询。将其视为“请在 html 中找到这些元素”。蜘蛛会找到它们,但如果要将它们分配给变量,则需要获取它们。所以你用 get() 如果您只想要一个结果,getAll() 如果您想要所有结果。您也可以使用extract()extract_first()
    所以最终的结果是:

    next_page = response.css('li.next a::attr(href)').get()

    它会为您提供下一页的网址。

    【讨论】:

    • 感谢您的反馈和时间。所以.get() .extract_first() 是一回事吗?
    • 没错,他们现在只是在文档中使用 get() 来获取更新的版本。
    • 非常感谢!我非常感谢您的努力和时间。保重!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多