代码改变世界

使用 Python 从网页中提取主要文本内容

2021-08-11 21:40  狼人:-)  阅读(3142)  评论(0编辑  收藏  举报

Web 数据挖掘涉及数据处理中的大量设计决策和转折点。根据数据收集的目的,可能还需要大量过滤和质量评估。虽然可以预期一些大规模算法会消除不规则性,但需要低误差幅度和仔细阅读方法的使用(例如在词典研究中搜索示例)意味着在构建和处理方面不断改进和改进数据集。

区分整个页面和正文内容可以帮助缓解许多与网页文本相关的质量问题:如果正文太短或多余,可能没有必要使用它。虽然它对于消除 Web 文档的重复很有用,但与内容提取相关的其他任务也受益于更清晰的文本库,因为它使处理“真实”内容成为可能。在语言和词典研究的具体情况下,它允许对文档中真正重要的唯一部分进行内容检查(例如语言检测)。

网页内容提取的挑战

由于文本语料库、文本类型和用例的种类越来越多,针对给定的研究目标评估某些网络数据的充分性和质量变得越来越困难。语料库构建中的核心操作包括保留所需内容而丢弃其余内容,该任务有许多名称指的是特殊子任务或整体:网页抓取、样板移除或样板检测、网页模板检测、网页清理、或网络内容提取——有关最近的概述,请参阅Lejeune & Zhu (2018)

最近,使用CommonCrawl 的方法蓬勃发展,因为它们允许通过跳过(或更准确地说是外包)爬行阶段来加快下载和处理速度。虽然我认为通过 Web 找到自己的“自己的”方式与某些使用场景非常相关,但很明显,在没有过滤的情况下不应使用CommonCrawl数据,它也可以从更精细的元数据中受益。

我已经写过关于使用 Python 模块htmldateHTML页面中提取日期的正在进行的工作,现在我将介绍我的处理链的第二个组件:trafilatura,一个用于文本提取的 Python 库。它侧重于主要内容,通常是中心显示的部分,没有左右栏、页眉或页脚,但包括潜在的标题和评论。

介绍使用 Trafilatura 进行文本抓取

Trafilatura是一个 Python 库,旨在下载、解析和抓取网页数据。它还提供了可以轻松帮助网站导航和从站点地图和提要中提取链接的工具。

其主要目的是查找网页的相关和原始文本部分,并去除由重复元素(页眉和页脚、广告、链接/博客等)组成的噪音。它必须足够精确,不会遗漏文本或丢弃有效文档,它还必须相当快,因为​​预计它会在生产中运行数百万页。

Trafilatura 在保留一些结构的同时抓取网页的主要文本,这项任务也称为样板移除、基于DOM的内容提取、主要内容识别或HTML文本清理。处理结果可以是TXTCSVJSON 和 XML格式。在后一种情况下,将保留基本格式元素,例如文本格式(粗体、斜体等)和页面结构(段落、标题、列表、链接、图像等),然后可将其用于进一步处理。

该库主要面向语言分析,但可以用于许多不同的目的。从语言的角度来看,尤其是与“前网络”和通用语料库相比,网络语料库构建的挑战在于提取和预处理生成的网络文本的能力,并最终使它们在可清晰描述和连贯的集合中可用.

因此 trafilatura 具有注释提取(与其余部分分开)、使用最近最少使用 ( LRU ) 缓存在句子、段落和文档级别进行重复检测、与文本编码倡议 ( XML TEI )建议兼容的XML输出以及语言对提取的内容进行检测。

该库适用于所有常见版本的 Python,可以按如下方式安装:

$ pip install tr​​afilatura # pip3(如果适用)

与 Python 一起使用

该库包含一系列 Python 函数,可以轻松重用并适应各种开发设置:

>>> 导入 trafilatura 
>>> 下载 =  trafilatura fetch_url ( 'https://github.blog/2019-03-29-leader-spotlight-erin-spiceland/' ) 
>>>  trafilatura extract ( downloaded ) 
# 将主要内容和评论输出为纯文本... 
>>>  trafilatura . extract ( downloaded ,  xml_output = True ,  include_comments = False ) 
# 输出没有注释的主要内容为 XML ...

这些值组合起来可能提供最快的执行时间,但不一定包括所有可用的文本段:

>>> 结果 = 提取(已下载include_comments = False include_tables = False no_fallback = True 

输入可以由先前解析的树(即 lxml.html 对象)组成,然后无缝处理:

>>> lxml 导入 html 
>>>  mytree  =  html fromstring ( '<html><body><article><p>这是正文。它必须足够长才能绕过安全检查。Lorem ipsum dolor sat amet, consectetur adipiscing elit, sed do eiusmod tempor incidundunt ut Labore et dolore magna aliqua。</p></article></body></html>' ) 
>>>  extract ( mytree ) 
'这是正文。它必须足够长才能绕过安全检查。Lorem ipsum dolor sat amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut Labore et dolore magna aliqua。

该函数bare_extraction可用于绕过转换并直接使用和转换原始输出:它返回元数据(作为字典)以及正文和注释(均作为LXML 对象)的Python 变量

>>> trafilatura 导入 裸提取
>>> 裸提取(已下载

在命令行上的使用

Trafilatura 包含一个命令行界面,无需编写代码即可方便地使用。

$ trafilatura -u "https://www.scientificamerican.com/article/statistically-speaking-elephants-by-the-numbers/" 
'帖子更新于 2013 年 8 月 13 日,上午 11:18
这是世界大象日。(谁知道?!)这里有一个关于我们称为大象的长鼻类动物正在进行的传奇的清醒更新。...'
$ trafilatura -h
# 显示所有可用选项

以下参数组合允许批量下载(包含的 URL links.txt)、在单独目录中备份HTML源、转换和将提取的文本存储为XML这对于存档和进一步处理特别有用:

$ trafilatura --inputfile links.txt --outputdir 转换/ --backup-dir html-sources/ --xml

潜在的替代品

尽管没有积极维护一些相应的 Python 包,但以下用于 Web 文本提取的替代方案包括:

  1. 保持文本结构完整但不关注正文的图书馆
  2. 专注于主要文本提取的库
  3. 提取正文同时提取文档元数据的库

Trafilatura 具有许多有用的功能,例如元数据、文本和评论提取以及提要和站点地图中的链接发现。仅在文本提取方面,它的表现已经明显优于可用的替代方案,请参阅以下抓取质量比较:

另一个问题可能在于缺乏与文档存储和处理的常见需求相对应的输出格式:该库可以将结果转换为CSVJSONXML 和 XML TEI

Ref: https://adrien.barbaresi.eu/blog/trafilatura-main-text-content-python.html