跳转到主要内容

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模式。

值得注意的是,随着域大小的增加,操作模式和多点处理之间的差异变得更加明显。

Performance Plot

创建自定义数据集

该包包含一个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 (28.3 kB 查看散列)

上传时间

构建分布

deboiler-2023.46.150-py3-none-any.whl (31.7 kB 查看散列)

上传时间 Python 3

支持者