python爬虫去除html中特定标签、去除注释、替换实体

本文介绍W3Lib库中四个关键函数:remove_tags, remove_tags_with_content, remove_comments 和 remove_entities,详细解析如何使用这些函数处理HTML源码,包括去除特定标签、注释和替换实体,提升爬虫数据清洗效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python爬虫去除html中特定标签、去除注释、替换实体

前言:本文主要讲w3lib库的四个函数

html.remove_tags()
html.remove_tags_with_content()
html.remove_comments()
html.remove_entities()


remove_tags

作用:去除或保留标签,但是仅仅是去除标签,正文部分是不做处理的

在这里插入图片描述

看其函数具有四个变量,

第一个是文本,即你需要传入的网页源码,必须是字符串

第二个是你要去除掉的标签,需要传入的参数类型是元组,原理是根据正则匹配去除的

第三个是你要保留的标签,需要传入的参数类型依旧是元组

第四个是编码

看备注我们可以得知,第二第三个参数总共有四种状态

which_oneskeepwhat it does
非空去除掉所有 which_ones里面的标签
非空只保留keep里的标签
去除所有的标签
非空非空不允许的情况

代码示例:
以下的代码以example.com的部分源码进行测试

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
from w3lib import html
import requests
from lxml import etree

res = requests.get("http://www.example.com/")
response = etree.HTML(res.content)
temp = response.xpath('//body') # 返回值为一个列表
doc = etree.tostring(temp[0])   # 将定位到的元素转成str,即获得源码

# 以上代码只是为了获取body的源码,与函数演示无关

result = html.remove_tags(doc) # 标签全部去除
print(result)

只留下正文部分

在这里插入图片描述

result = html.remove_tags(doc,which_ones = ('body','h1','div'))

p标签与a标签还留着

在这里插入图片描述

remove_tags_with_content

作用:去除标签,包括其正文部分

在这里插入图片描述

参数变成了三个,与上面的用法一致,只是少了一个keep参数,无法保留,只能去除

remove_comments

作用:去除掉网页的注释

参数只有两个,一个是text(网页源码),str类型,一个是编码(encoding)

from w3lib.html import remove_comments
remove_comments(b"test <!--textcoment--> whatever")

结果即test whatever

remove_entities

作用:将网页中的一些特殊字符的源码显示改变成正常显示(个人理解)

官方解释是通过将实体转换为相应的unicode字符,从给定的text中删除实体。

在函数源码中已声明,该函数即将被剔除,将被replace_entities取代

在这里插入图片描述

函数具有三个参数,第一个是源码(字符串),第二个是你需要保留不变的实体(元组),第三个是是否删除无法转换的实体(true删除,false不删除),第四个是编码,默认utf-8

from w3lib.html import replace_entities
print(replace_entities(b'Price: &pound;100'))

以下为结果

Price: £100

该模块还是挺有意思的,还有几个常用的函数等我有空了会再次补充的~

对您有帮助的话记得点个赞哦~

### Python 爬虫清理 HTML 标签方法 #### 使用 `scrapy` 的内置函数 Scrapy 提供了实用的标记移除工具,可以方便地清除不需要的HTML标签。具体来说,可以从 `scrapy.utils.markup` 导入两个主要函数: - `remove_tags`: 移除所有的HTML/XML标签并保留其内部文本。 - `remove_tags_with_content`: 不仅会删除指定类型的标签本身还会连同它们的内容一起被去掉。 这使得开发者能够灵活控制哪些部分应该保留在最终的结果里[^1]。 ```python from scrapy.utils.markup import remove_tags, remove_tags_with_content html_fragment = "<div><p>Hello world!</p></div>" clean_text = remove_tags(html_fragment) print(clean_text) # 如果想要移除某些特定标签及其内容,则可如下操作: specific_tag_removal = remove_tags_with_content(html_fragment, which_ones=('script', 'style')) print(specific_tag_removal) ``` #### 利用第三方库 `python-readability` 另一个强大的选项是采用专门设计用于网页内容提取的库——`python-readability`。这个库基于Arc90实验室开发的一个算法实现了一个简洁易用API接口,它能自动识别页面主要内容区域并将其他干扰性的广告、导航栏等内容过滤掉[^2]。 ```python import readability from bs4 import BeautifulSoup raw_html = '<html>...</html>' # 假设这是从网络上获取到的一段完整的HTML字符串 document = Document(raw_html).summary() soup = BeautifulSoup(document, "lxml") text_only = soup.get_text(separator="\n", strip=True) print(text_only) ``` #### 结合 `lxml` 进行更精细的操作 当面对复杂的HTML结构时,`lxml` 是一个非常有效的解决方案。该库允许精确选择节点并通过XPath表达式定位目标元素,从而实现更加细致化的清洗工作。此外,还可以利用正则表达式匹配模式进一步增强处理能力[^3]。 ```python from lxml.html import fromstring import re def clean_html(html_string): tree = fromstring(html_string) # 删除脚本和样式表 for elem in tree.xpath("//script|//style"): elem.drop_tree() # 替换特殊字符实体为对应的Unicode字符 cleaned_text = re.sub(r'&(#?)(\w+);', lambda m: chr(int(m.group(2))) if m.group(1)=='#' else '', html.tostring(tree, encoding='unicode')) return cleaned_text.strip() example_html = """ <html> <head><title>Title</title></head> <body> <p>This is a paragraph.</p> <script type="text/javascript">alert('Hello');</script> <style>.hidden { display:none; }</style> </body> </html> """ result = clean_html(example_html) print(result) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值