Scrapy返回从css选择器开始的整个网页



我正在抓取博客文章,遇到了一个奇怪的问题。当提取整个元素而不是仅提取其文本时,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()
}

谢谢你能提供的任何帮助。

相关:在剪贴中使用response.xpath((或response.css时没有打印文本

同样相关的:Python:Scrapy返回元素后面的所有html,而不仅仅是元素的html

它看起来像是一个环境错误。我要试着重新安装蟒蛇。

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

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

最新更新