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

Scrapy如何提取id包含class_id的所有元素的文本内容

Scrapy提取指定id锚点元素下文本节点的实现方法

你当前的XPath写法存在语法问题,无法正确提取目标文本,可根据需求选择对应实现方式:

  • 提取所有匹配a标签下的全部文本(包含a标签内部嵌套子元素的文本,日常爬虫最常用场景)
    不要用错误的*::text语法,正确的XPath路径是匹配到a节点后,用//text()取所有后代文本节点,配合Scrapy的getall()方法提取结果。如果需要逐个a标签对应提取文本、避免不同节点的文本混淆,就先遍历匹配到的a节点,从当前节点出发做相对路径查找:
    def parse(self, response):
        page = response.url.split("/")[-2]
        # 逐节点提取,避免不同a标签的文本混排
        for a_tag in response.xpath('//a[contains(@id, "class_id")]'):
            # 相对路径查找,前面加.表示从当前a节点开始匹配
            all_text = a_tag.xpath('.//text()').getall()
            # 拼接文本、去除首尾多余的空白、换行符
            cleaned_text = ''.join(all_text).strip()
            print(cleaned_text)
    
        filename = f'class-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')
    
  • 仅提取a标签的直接文本子节点(不包含a标签内部嵌套的span、div等子元素里的文本)
    把XPath路径改成./text()即可,仅匹配当前节点的直接子文本节点:
    for a_tag in response.xpath('//a[contains(@id, "class_id")]'):
        direct_text = a_tag.xpath('./text()').getall()
        cleaned_direct_text = ''.join(direct_text).strip()
        print(cleaned_direct_text)
    

注意点:遍历单个节点做XPath匹配时,路径前必须加.,否则会默认从整个HTML文档的根节点开始查找文本,导致提取结果错乱。

内容的提问来源于stack exchange,提问作者John Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:09:24