在Python中使用正则提取HTML中的所有文本

0 投票
3 回答
2751 浏览
提问于 2025-04-17 15:09

我该如何从一段部分的HTML文本中提取出所有不是HTML标签的内容呢?

也就是说,如果我有这样的内容:

<div>Hello</div><h3><div>world</div></h3>

我想提取出 ['Hello','world']

我考虑过使用正则表达式:

>[a-zA-Z0-9]+<

但是这样做不会包括特殊字符以及中文或希伯来文字符,而这些我都是需要的。

3 个回答

-1

我对Python不太熟悉,不过下面这个正则表达式可以帮到你。

<\s*(\w+)[^/>]*>

其中,

<: starting character

\s*: it may have whitespaces before tag name (ugly but possible).

(\w+): tags can contain letters and numbers (h1). Well, \w also matches '_', but it does not hurt I guess. If curious use ([a-zA-Z0-9]+) instead.

[^/>]*: anything except > and / until closing >

\>: closing >
1

正如Avi所说,这个任务用普通的正则表达式来处理太复杂了。你可以使用 BeautifulSoup 中的 get_text 方法,或者使用 nltk 中的 clean_html 来从你的HTML中提取文本。

from bs4 import BeautifulSoup
clean_text = BeautifulSoup(html).get_text()

或者

import nltk
clean_text = nltk.clean_html(html)

还有一个选择,感谢GuillaumeA,可以使用 pyquery

from pyquery import PyQuery
clean_text = PyQuery(html)

需要说明的是,上面提到的HTML解析器在处理格式不太好的HTML时,效果会有所不同,所以你应该尝试一下,看看哪个最适合你的输入数据。

3

你可以看看类似于用正则表达式从HTML中提取文本这样的内容。

从那篇文章中:

其实用正则表达式来解析HTML并不是个好主意,因为HTML结构太复杂了。正则表达式可能在浏览器里能正常显示文本,但对于初学者来说,它可能会让人感到困惑。

如果你想更顺利地处理HTML,使用专门的HTML解析器会更好。比如,Python的用户通常会用Beautiful Soup这个工具来解析HTML,去掉标签和脚本。

另外,浏览器本身设计得很宽容,能处理一些不规范的HTML。所以你可能会遇到一些明显不正确的HTML,但在浏览器里却能正常工作。

虽然你可以用正则表达式来解析一些糟糕的HTML,只要有耐心和努力是可以做到的。但其实用别人的解析器会简单得多。

撰写回答