Deboiler是一个开源包,用于清理整个域中的HTML页面
项目描述
Deboiler
Deboiler是一个网页清理的Python模块,遵循Apache许可证发布。它是一种简单而新颖的域清理算法。给定一个网站的所有页面,它能够识别并删除样板元素。
Deboiler网页清理方法的好处包括
- 它是完全无监督的,不需要任何人工标注。
- 它在清理过程中保留HTML结构,并可以返回清洗后的HTML和文本。
方法
从高层次来看,deboiler
通过识别域中两个页面之间共享的近似相同的子树(来自html DOM树)来检测样板元素。以下提供了关于底层方法的更多细节
-
候选子树:页面中的候选子树是标签来自有限列表(如
<div>
、<nav>
、<navigation>
、<footer>
、<header>
等)的节点。 -
子树比较:每个子树都用纯文本表示,该文本是通过递归连接所有组成部分的表示创建的。在这个过程中,忽略了HTML标签属性。例如,在节点
<a href="https://www.linkedin.com/foo">Linkedin</a>
中,属性href="https://www.linkedin.com/foo"
被忽略。因此,具有相似结构和相似文本,但可能具有不同标签属性的类似结构的子树将具有相同的表示。 -
来自一对页面的样板元素:给定同一域中的一对页面,共享(具有相同表示)的候选子树被认为是样板。
-
所有域的模板元素: 从每一对中识别的模板元素被添加到该域的所有模板元素集合中。我们使用一种复杂度为
O(n)
的有效方法,通过按URL对页面进行排序并比较每个页面与下一个页面。这基于以下观察:大多数现代域都利用URL路径中的文件夹结构,因此,具有类似父目录的页面通常比随机配对的页面更相似。因此,可以以更少的计算识别出更多的模板元素。 -
防止相同页面: 为了防止比较相同页面(并无意中将所有元素标记为模板),我们避免使用交集与并集(即共享元素与所有元素的比例)高于一定阈值的配对。
-
清理页面: 要从域中清理页面,将删除页面上属于域模板元素的任何子树。
安装
pip install deboiler
如何使用
本包包含了一个基于LXML的、内存高效且快速实现的模板检测算法,具有类似scikit-learn
的简单API。
from deboiler.dataset import JsonDataset
from deboiler import Deboiler
dataset = JsonDataset("path-to-json-lines-file")
deboiler = Deboiler(
n_processes=1, # no of processes
operation_mode="memory", # operation mode: `memory` or `performance`
domain="globality", # domain name (used for logging only)
)
# call the fit method to identify boilerplate elements
deboiler.fit(dataset)
output_pages = []
# call the transform method to yield cleaned pages
for output_page in deboiler.transform(dataset):
# do something with the output_page
output_pages.append(output_page)
操作模式
deboiler
支持两种操作模式
-
低内存模式:此模式具有最低的内存占用。它还支持多进程。
-
高性能模式:在此模式下,在
fit
过程中保留解析页面以在transform
过程中重复使用,从而在更高的内存占用下实现更快的处理。此模式不支持多进程。
单进程 | 多进程 | |
---|---|---|
低内存模式 | :heavy_check_mark | :heavy_check_mark |
高性能模式 | :heavy_check_mark | :x |
以下图表比较了不同操作模式和进程数下deboiler
的性能。在此基准测试中,deboiler
清理了来自约140个域的10-10k个页面。与单进程的memory
模式相比(38分钟与54分钟),performance
模式完成任务的更快。但是,如果启用多进程(例如,本例中的5或10个进程),则memory
模式可以优于performance
模式。
值得注意的是,随着域大小的增加,操作模式和多点处理之间的差异变得更加明显。
创建自定义数据集
该包包含一个JsonDataset
类。它期望一个json行文件,并具有可选参数以过滤成功爬取的html页面。
如果数据集需要更精细,可以通过从DeboilerDataset
派生并实现__getitem__
和__len__
方法以及urls
属性来创建自定义数据集。在类实例化期间创建数据索引通常很有益,允许在__getitem__
中对记录进行随机访问。您可以参考deboiler/dataset/json_dataset.py
作为示例。
测试
按照以下方式运行测试:
bash entrypoint.sh test
或简单地
pytest .
一些选项
-s
以显示打印并能够调试--pdb
在出现异常时触发调试器pytest route_to_test
测试特定的测试文件pytest route_to_test::test_function
测试特定的测试函数pytest route_to_test::test_function[test_case]
--cov-report term
以显示覆盖率
您可能还会在entrypoint.sh
中找到其他代码检查器。请注意,这些是在您打开拉取请求时针对您的代码运行的。
贡献
欢迎所有贡献,包括错误报告、安全问题、错误修复、文档改进、增强和想法。本节是从pandas贡献指南中改编和简化的。
提交和问题
错误报告、安全问题和增强请求是使开源软件更稳定的重要部分,并通过GitHub问题进行管理。在报告问题或请求时,请完整填写问题表单,以确保其他人以及核心开发团队能够完全理解问题的范围。
然后问题将显示给社区,并对外开放来自他人的评论/想法。
提交拉取请求
deboiler
托管在GitHub上,要贡献,您需要注册一个免费的GitHub帐户。我们使用Git进行版本控制,以允许许多人共同参与项目。如果您是Git的新手,可以参考上面提到的pandas贡献指南中的资源。
此外,该项目遵循标准的分支工作流程,即贡献者分支仓库,进行更改,创建功能分支,推送更改,然后创建拉取请求。为了避免重复,请遵循上面提到的pandas贡献指南中的所有说明。
行为准则
作为本项目的贡献者和维护者,您应遵守行为准则。更多信息可以在贡献者行为准则中找到。
项目详情
下载文件
下载您平台对应的文件。如果您不确定选择哪一个,可以了解更多关于安装包的信息。
源分布
构建分布
deboiler-2023.46.150.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 90ed6737dd0c8e4de31c18d435bc8e72a114962df680b2af756a7d9686a5c0a7 |
|
MD5 | 8393b421f83fb8eb05288da2174cba5a |
|
BLAKE2b-256 | b04bddff26a8399e988d4248c59c28394362a505ceeb4e6aff620d8bc45c7f49 |
deboiler-2023.46.150-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4891db91c84c654fdd62941af7b8218f4110eda2c17b0a9adc0b6633f394005e |
|
MD5 | 9721b42eefd36c72583de6d16a4ec395 |
|
BLAKE2b-256 | 96ee6d38a2e1470055ff41861267fcb3d05fd0e017be1749d75809bf9bbd70ba |