在Python中使用正则提取HTML中的所有文本
我该如何从一段部分的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,只要有耐心和努力是可以做到的。但其实用别人的解析器会简单得多。