如何使用Scrapy通过'role'标签爬取指定网页内容?
解决思路
1. 修正XPath语法错误
原代码中的"是HTML转义字符,Scrapy的XPath中直接使用双引号即可,无需转义。
2. 正确获取讲师节点集合
原代码通过response.xpath('//div[@role="rowgroup"]/li/text()').extract()获取的是纯文本内容,并非节点对象,导致后续无法调用.css()或.xpath()方法。应修改为获取li节点对象:
lecturers = response.xpath('//div[@role="rowgroup"]/li')
3. 基于节点提取目标数据
遍历每个讲师节点时,要基于当前节点做相对路径选择,避免全局路径导致的重复提取问题:
def parse(self, response): lecturers = response.xpath('//div[@role="rowgroup"]/li') for lecturer in lecturers: item = UniversityItem() # 从当前li节点下提取name类文本 item['name'] = lecturer.css('div.name::text').get(default='') # 从当前li节点下提取info类下的p文本 item['job'] = lecturer.css('div.info p::text').get(default='') yield item
4. 优化数据提取方式
推荐使用.get(default='')替代.extract_first(),前者可以指定默认空值,避免返回None引发潜在问题。
完整修正后的main.py代码
import scrapy from ..items import UniversityItem class UniversityLecturersSpider(scrapy.Spider): name = 'university_lecturers' allowed_domains = ['www.runi.ac.il'] start_urls = ['https://www.runi.ac.il/en/about/management/'] def parse(self, response): lecturers = response.xpath('//div[@role="rowgroup"]/li') for lecturer in lecturers: item = UniversityItem() item['name'] = lecturer.css('div.name::text').get(default='') item['job'] = lecturer.css('div.info p::text').get(default='') yield item
内容的提问来源于stack exchange,提问作者oran ben david
相关产品推荐
相关产品推荐

