如何让Python Scrapy跳过CSS规则、HTML属性并忽略指定标签
Scrapy爬取联系方式误识别问题解决方案
清理无关标签再提取内容
在做联系方式匹配前,先从DOM中移除所有不需要的标签,从根源上避免这类标签内的内容被误识别,代码示例:
def parse(self, response): selector = response.selector # 按需求添加要排除的标签 exclude_tags = ['script', 'svg', 'style', 'noscript', 'iframe'] for tag in exclude_tags: selector.xpath(f'//{tag}').drop() # 后续使用清理后的selector操作即可 cleaned_text = ' '.join(selector.xpath('//body//text()').getall())
仅匹配纯文本,跳过HTML标签和属性
不要直接对整份response.text做正则匹配,这种方式会扫描所有HTML标签、属性内容,很容易出现误判。改为先提取所有可见文本节点再匹配,自动忽略所有HTML结构:
# 错误写法:会扫描整份HTML源码,包含标签、属性 # phones = re.findall(r'1[3-9]\d{9}', response.text) # 正确写法:仅提取正文纯文本后再匹配 all_text = ' '.join(response.xpath('//body//text()').getall()) phones = re.findall(r'1[3-9]\d{9}', all_text) emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', all_text)
增加匹配结果校验过滤误判
针对图片名误判为邮箱的场景,可以对匹配到的结果加一层后缀过滤:
# 过滤掉图片、静态资源后缀的无效邮箱 invalid_suffix = ('.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.css', '.js') valid_emails = [e for e in emails if not e.lower().endswith(invalid_suffix)]
内容的提问来源于stack exchange,提问作者Redgren Grumbholdt
相关产品推荐
相关产品推荐

