跳转到主要内容

从HTML中提取文本

项目描述

HTML到文本

PyPI Version Supported Python Versions Build Status Coverage report

从HTML中提取文本

  • 免费软件:MIT许可证

html_text与LXML的.xpath('//text()')或Beautiful Soup的.get_text()有何不同?

  • 使用html_text提取的文本不包含内联样式、javascript、注释和其他用户通常看不到的文本;

  • html_text会标准化空白字符,但比.xpath('normalize-space())')更智能,会在内联元素周围添加空格(这些元素通常在HTML标记中用作块元素),并尝试避免为标点符号添加额外的空格;

  • html-text可以添加换行符(例如,在标题或段落之后),这样输出文本看起来更像是浏览器中的渲染效果。

安装

使用pip安装

pip install html-text

该包依赖于lxml,因此您可能需要安装额外的包:[http://lxml.de/installation.html](http://lxml.de/installation.html)

用法

从HTML中提取文本

>>> import html_text
>>> html_text.extract_text('<h1>Hello</h1> world!')
'Hello\n\nworld!'

>>> html_text.extract_text('<h1>Hello</h1> world!', guess_layout=False)
'Hello world!'

传入的HTML首先会从不可见的非文本内容(如样式)中清理,然后提取文本。

您还可以传入已经解析的 lxml.html.HtmlElement

>>> import html_text
>>> tree = html_text.parse_html('<h1>Hello</h1> world!')
>>> html_text.extract_text(tree)
'Hello\n\nworld!'

如果您愿意,可以手动处理清理;在这种情况下使用低级别的 html_text.etree_to_text

>>> import html_text
>>> tree = html_text.parse_html('<h1>Hello<style>.foo{}</style>!</h1>')
>>> cleaned_tree = html_text.cleaner.clean_html(tree)
>>> html_text.etree_to_text(cleaned_tree)
'Hello!'

parsel.Selector对象也受到支持;您可以为只从特定元素中提取文本定义一个parsel.Selector

>>> import html_text
>>> sel = html_text.cleaned_selector('<h1>Hello</h1> world!')
>>> subsel = sel.xpath('//h1')
>>> html_text.selector_to_text(subsel)
'Hello'

注意:parsel.Selector对象不会自动清理,您需要先调用 html_text.cleaned_selector

主要函数和对象

  • html_text.extract_text 接受HTML并返回提取的文本。

  • html_text.etree_to_text 接受解析的lxml Element并返回提取的文本;这是一个低级别函数,这里不处理清理。

  • html_text.cleaner 是一个 lxml.html.clean.Cleaner 实例,可以与 html_text.etree_to_text 一起使用;其选项针对速度和文本提取质量进行了调整。

  • html_text.cleaned_selector 接受HTML作为文本或作为 lxml.html.HtmlElement,并返回清理后的 parsel.Selector

  • html_text.selector_to_text 接受 parsel.Selector 并返回提取的文本。

如果 guess_layout 为True(默认值),则在新行标记前后添加换行符,在双换行标记前后添加两个换行符。这种启发式方法使得提取的文本更类似于在浏览器中的渲染方式。默认的新行和双换行标记可以在 html_text.NEWLINE_TAGShtml_text.DOUBLE_NEWLINE_TAGS 中找到。

您可以使用 newline_tagsdouble_newline_tags 参数(默认为 html_text.NEWLINE_TAGShtml_text.DOUBLE_NEWLINE_TAGS)自定义添加换行的方式。例如,不要在 <div> 标签后添加换行符

>>> newline_tags = html_text.NEWLINE_TAGS - {'div'}
>>> html_text.extract_text('<div>Hello</div> world!',
...                        newline_tags=newline_tags)
'Hello world!'

除了从页面中获取文本(例如,用于显示或搜索)之外,此库的一个预期用途是用于机器学习(特征提取)。如果您想将HTML页面的文本作为特征(例如,用于分类),此库为您提供可以随后输入到标准文本分类管道中的纯文本。如果您认为您还需要HTML结构,请查看 webstruct 库。

历史记录

0.6.2 (2024-05-01)

  • 通过使用迭代而不是递归来支持更深的树。

0.6.1 (2024-04-23)

0.6.0 (2024-04-04)

  • 将Git存储库移动到 https://github.com/zytedata/html-text

  • 添加了对Python 3.9-3.12的官方支持。

  • 移除了对Python 2.7和3.5-3.7的支持。

  • 将lxml依赖项切换到 lxml[html_clean],以支持 lxml >= 5.2.0

  • 从Travis CI切换到GitHub Actions。

  • CI改进。

0.5.2 (2020-07-22)

0.5.1 (2019-05-27)

修复了当 guess_punct_space 为False时的空格处理:html-text在换行后生成不必要的空格。

0.5.0 (2018-11-19)

在此版本中删除了parsel依赖项,尽管parsel仍然受到支持。

  • parsel 包不再是安装和使用html-text所必需的;

  • html_text.etree_to_text 函数允许从lxml Elements中提取文本。

  • html_text.cleaner 是一个针对文本提取速度和质量调优的 lxml.html.clean.Cleaner 实例;

  • 测试和文档改进;

  • 支持 Python 3.7。

0.4.1 (2018-09-25)

修复了 0.4.0 版本中的回归问题:当使用具有文本但没有子节点的节点调用 html_text.extract_text 时,文本为空。

0.4.0 (2018-09-25)

这是一个不兼容的版本:默认情况下,html_text 函数现在会在元素后添加换行符(如果适用),以便提取的文本看起来更接近在浏览器中的渲染方式。

要关闭此功能,请将 guess_layout=False 选项传递给 html_text 函数。

  • guess_layout 选项用于使提取的文本看起来更接近在浏览器中的渲染方式。

  • 添加了针对真实网页的布局提取测试。

0.3.0 (2017-10-12)

  • 公开了对选择器进行操作的函数,使用 .//text() 从选择器提取文本。

0.2.1 (2017-05-29)

  • 打包修复(包括 CHANGES.rst)

0.2.0 (2017-05-29)

  • 修复了内联标签引起的单词不想要的连接:也为内联标签添加了空格,但使用启发式方法来保留标点符号,而不会添加额外的空格。

  • 接受解析的 HTML 树。

0.1.1 (2017-01-16)

  • 添加了 Travis-CI 和 codecov.io 集成。

0.1.0 (2016-09-27)

  • PyPI 上的第一个版本。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

html_text-0.6.2.tar.gz (53.6 kB 查看哈希)

上传时间

构建分发

html_text-0.6.2-py2.py3-none-any.whl (7.7 kB 查看哈希)

上传时间 Python 2 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面