使用Scrapy提取id时返回None,求技术解决方案
解决方案
问题核心
- 页面是动态渲染的:目标id字段由JavaScript生成,普通
scrapy.Request只能抓取静态HTML,无法获取动态加载的内容。 - 提取逻辑有瑕疵:直接返回Selector对象而非实际文本值,且XPath可能存在冗余定位。
修正步骤
1. 改用SeleniumRequest加载动态内容
你已导入SeleniumRequest但未实际使用,替换普通请求确保页面完全渲染:
def start_requests(self): keywords=['Alsace'] for keyword in keywords: amaz_url=f"https://www.pagesjaunes.fr/annuaire/region/{keyword}/reparateur-electromenager" yield SeleniumRequest( url=amaz_url, callback=self.parse, meta={'keyword':keyword}, wait_time=3 # 等待页面渲染,可根据实际情况调整时长 )
2. 修正XPath与提取方式
- 精简XPath:如果id直接在
li.bi.bi-generic标签上,路径改为//li[@class='bi bi-generic']/@id(去掉多余的//);若id在子元素内,需对应调整路径。 - 提取实际值:用
.getall()批量获取,且判断过滤空值:
def parse(self,response): keyword=response.meta['keyword'] for item_id in response.xpath("//li[@class='bi bi-generic']/@id").getall(): if item_id: yield{ 'id': item_id, 'keyword': keyword }
3. 验证页面内容(可选)
若仍无法提取,先打印页面源码确认动态内容是否加载:
def parse(self,response): print(response.text) # 查看渲染后的HTML是否包含目标id # 后续提取逻辑...
完整修正代码
import scrapy from scrapy_selenium import SeleniumRequest class BarSpider(scrapy.Spider): name = 'bar' def start_requests(self): keywords=['Alsace'] for keyword in keywords: amaz_url=f"https://www.pagesjaunes.fr/annuaire/region/{keyword}/reparateur-electromenager" yield SeleniumRequest( url=amaz_url, callback=self.parse, meta={'keyword':keyword}, wait_time=3 ) def parse(self,response): keyword=response.meta['keyword'] for item_id in response.xpath("//li[@class='bi bi-generic']/@id").getall(): if item_id: yield{ 'id': item_id, 'keyword': keyword }
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

