【发布时间】: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