利用 lxml 库的 Cleaner 类清洗标签

lxml 是一款功能强大和易用的 Python 库,主要用来处理 XML 和 HTML,很多爬虫工具都会用到它,而且因为 lxml 是基于 C 语言的 libxml2 和 libxslt 库,所以解析速度会快很多。

本文记录使用 lxml 库里的 Cleaner 类来清洗 HTML 文档中的各种多余元素。

比如要获取某些新闻网站的正文内容,xpath 定位总有一些控制页面样式的 script、style 标签影响结果,又或者想直接保存网页,部分用不到的标签内容会占用存储空间,直接删除最好,此时 lxml 的 Cleaner 能派上用场。

Cleaner 类在 lxml 库 html 包的 clean 子模块中,导入时使用 from lxml.html.clean import Cleaner,官方文档里说:这个类用来清洗文档中令人不爽的元素,清除过程由属性控制,你可以在子类中重写这些属性,或在构造函数中设置它们。有一些默认参数:

script:删除所有 script 标签,默认为 True。

javascript:删除所有 javascript 代码,比如 onclick 属性,同样会删除 javascript 中的样式表。默认为 True。

comments:删除所有注释,默认为 True。

style:删除所有 style 标签,默认为 False。

inline_style:删除内联样式,默认是标签的 style 属性。

links:删除所有 link 标签,默认为 True。

meta:删除所有 meta 标签,默认为 True。

page_structure:补全页面结构,即添加 head、html、title 标签,默认不添加。

processing_instructions:删除处理指令。

embeded:删除 flash,iframes 等嵌入元素。

frames:删除 frame 相关标签。

forms:删除表单元素。

annoying_tags:删除 blink 和 marquee 这些令人讨厌的、已淘汰的标签。彩蛋:Google 搜索 blink tag

remove_tags:标签列表,里面是所有想移除的标签。注意,这里只会移除标签,但标签之间的内容会保留。

kill_tags:标签列表,相比 remove_tags,会删除所有子标签和标签间的内容。

allow_tags:标签列表,只有列出的标签才会保留,其他全部删除。

remove_unknown_tags:删除所有非 HTML 标准的标签。

safe_attrs_only:默认为 True,会删除所有元素的属性。为确保页面结构可以设置 False。

safe_attrs:一组属性名的集合,会覆盖默认列表,在 safe_attrs_only=True 时生效。

add_nofollow:默认 False,为 True 时会自动给 a 标签添加 rel="nofollow" 属性。

host_whitelist:包含域名的列表或集合,这些站点的内容允被许嵌入到页面中,比如 objectlink rel="stylesheet" 等标签。可以重写或覆盖 allow_embedded_url(el, url)allow_element(el) 来实现更复杂的嵌入规则。不管嵌入对象的指是啥,只要符合这个规则的内容都会被显示。

whitelist_tags:一个可以使用上面 host_whitelist 的标签集合,默认只有 iframe 和 embed。

示例代码

# 导入模块
from lxml.html.clean import Cleaner

# 保留标签的 src 属性
safe_attrs = frozenset(['src'])
# 删除 a 标签
remove_tags = frozenset(['a'])
# 实例化
cleaner = Cleaner(
    style=True,
    scripts=True,
    javascript=True,
    safe_attrs=safe_attrs,
    remove_tags=remove_tags,
)

html = """
<link rel="icon" href="favicon.ico" type="image/x-icon">
<p style="color: sienna; margin-left: 20px">
    <script>
        This is a paragraph
    </script>
    	hello world
</p>
    <a href="aaa.jpg" target="_blank">
        <img src="aaa.jpg" alt="测试图片">
    </a>
"""

cleaned_html = cleaner.clean_html(html)

# 最后打印的内容为:
"""
<div>
<body><p>
    	hello world
</p>
        <img src="aaa.jpg">
</body></div>
"""

参考资料

» 链接地址:https://wbt5.com/lxml-cleaner.html »英雄不问来路,转载请注明出处。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注