【问题标题】:How do i scrape all content if it has various tags within it?如果内容中有各种标签,我如何抓取所有内容?
【发布时间】:2019-12-21 02:35:11
【问题描述】:

我有一个蜘蛛,我想抓取一篇我感兴趣的文章,然后将标题和内容存储在字典中。但是,当我抓取正文时,它会返回 html 代码,我想将其转换为文本(包括文章中的所有 h1 和 href),但是当我使用 .getall() 时,它会返回一个空列表。我如何将这一切都变成文本,并且仍然保留文章中的所有内容。

在我尝试过的scrapy shell 中,它返回了一个包含所有html 代码的大列表。

    response.css("div.rich-text-content").getall()

下面是我为了完成这项任务而创建的初始蜘蛛...

  class ArticleSpider(scrapy.Spider):
        name = "article"

        def start_requests(self):
            urls = [
                "https://www.codehousegroup.com/insight-and-inspiration/tech-stream/what-is-machine-learning"
            ]
            for url in urls:
                yield scrapy.Request(url=url, callback=self.parse)

        def parse(self, response):
              for quote in response.css("div.article-page"):
                yield {
                    'heading': quote.css("h1::text").get(),
                    'text': quote.css("p.rectangle-decoration::text").get(),
                    'body': quote.css("div.rich-text-content rich-text-content::text").getall(),
                }

预期结果是一个字符串,其中包含当前在我的字典正文项中的所有内容,只是没有标签。

【问题讨论】:

标签: python web-scraping scrapy


【解决方案1】:

您可以使用 xpath 代替 css。

例子:

for quote in response.xpath('//div[@class="article-page"]'):
    text = quote.xpath("/h1/text()").get()
    ...

【讨论】:

  • 我对scrapy相当陌生,但是从我所读的内容来看(如果我错了请纠正我)除非您通过路径查询,否则使用css和xpath之间没有太大区别,其中文档建议最好使用 css。无论如何,这仍然会导致仅获取 html 而不是文本的相同问题。
  • Xpath 是在 XML(或 HTML)文件中查找信息的标准。我在这里给你一个教程docs.scrapy.org/en/xpath-tutorial/topics/xpath-tutorial.html
【解决方案2】:

如果我猜对了,您需要选择 div 标签中的所有内部元素并返回它们的文本。

您可以在 css 中使用 * 来选择所有内部元素:

'body': quote.css("div.rich-text-content *::text").getall()

【讨论】:

  • hmm 这可能是一种方法,尽管它返回一个非常混乱的列表。我想我可以通过 '\n' 拆分并将它们全部连接在一起......如果有更有效的方法让我知道!
  • 除了收集列表中的所有文本之外别无他法。然后,您可以使用输入/输出处理器处理 Items.py 中的列表。如果你得到不必要的项目,你可以编辑选择器。
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2011-09-27
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多