You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:01:00