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

如何抓取包含<!-- -->注释的节点文本?Scrapy爬取问题求助

解决Scrapy爬取hh.ru公司名时仅获取ПАО的问题

问题原因

你使用的CSS选择器.bloko-link_kind-tertiary::text默认只会返回匹配元素下的第一个文本节点,而目标节点的结构是:

ПАО
<!---->
'company's name'

注释节点把ПАО和真实公司名隔开,导致get()只拿到了第一个文本节点ПАО。

可行解决方案

方案1:获取所有文本节点后拼接清洗

把原代码中获取公司名的语句替换为:

'company': ''.join(vacancy.css(self.JOB_COMPANY_SELECTOR).getall()).strip()

getall()会提取该元素下所有文本节点(包括注释后的公司名),join()拼接所有文本,strip()去掉前后多余空白。

方案2:改用XPath的normalize-space方法(推荐)

XPath的normalize-space()可以直接提取元素内所有有效文本(自动忽略注释、多余换行和空格),替换代码如下:

'company': vacancy.xpath('normalize-space(.//a[contains(@class, "bloko-link_kind-tertiary")])').get()

这个方法更简洁,不需要额外拼接处理。

方案3:添加兜底清洗函数

如果仍有格式问题,可以自定义清洗函数统一处理:

def clean_company_name(text):
    if not text:
        return None
    # 合并所有空白字符为单个空格,去掉前后空白
    return ' '.join(text.split()).strip()

# 在parse方法中调用
company_raw = ''.join(vacancy.css(self.JOB_COMPANY_SELECTOR).getall())
'company': clean_company_name(company_raw)

修改后的完整代码示例

import scrapy 

class HHSpider(scrapy.Spider):
    name = 'hh-spider'
    start_urls = [
        'https:<ENDPOINT>'
        ]

    def __init__(self):
        self.BASE_URL = 'https://hh.ru'
        self.JOB_SELECTOR = '.vacancy-serp-item-body'
        self.JOB_TITLE_SELECTOR = '.serp-item__title::text'
        self.JOB_COMPANY_SELECTOR = '.bloko-link_kind-tertiary::text'
        self.JOB_COMPANY_URL_SELECTOR = '.bloko-link_kind-tertiary::attr(href)'
        self.JOB_COMPENSATION_SELECTOR = '.bloko-header-section-2::text'
        self.NEXT_SELECTOR = '.bloko-button[data-qa="pager-next"]::attr(href)'

    def parse(self, response):
        for vacancy in response.css(self.JOB_SELECTOR): 
            # 用XPath方法获取清洗后的公司名
            company_name = vacancy.xpath('normalize-space(.//a[contains(@class, "bloko-link_kind-tertiary")])').get()
            yield {
                'jobTitle' : vacancy.css(self.JOB_TITLE_SELECTOR).get(),
                'compensation' : vacancy.css(self.JOB_COMPENSATION_SELECTOR).get(),
                'company' : company_name,
                'companyUrl' : self.BASE_URL + vacancy.css(self.JOB_COMPANY_URL_SELECTOR).get()
            }

        next_page = response.css(self.NEXT_SELECTOR).get()
        if next_page is not None:
            yield scrapy.Request(response.urljoin(next_page))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:14