如何抓取包含<!-- -->注释的节点文本?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
相关产品推荐
相关产品推荐

