如何从部分 html 文本中提取不是 html 标记的所有内容?
也就是说,如果我有以下类型:
<div>Hello</div><h3><div>world</div></h3>
我想提取 ['Hello','world']
我想到了正则表达式:
>[a-zA-Z0-9]+<
但它不会包含我需要的特殊字符和中文或希伯来文字符
你应该看看像正则表达式这样的东西来从 HTML 中提取文本
从那个帖子:
您无法真正使用正则表达式解析 HTML。这太复杂了。RE 不会处理将在浏览器中作为正确的文本工作,但可能会使天真的 RE 感到困惑。
使用适当的 HTML 解析器,您会更快乐、更成功。Python 人经常使用 Beautiful Soup 来解析 HTML 并去除标签和脚本。
此外,浏览器在设计上允许格式错误的 HTML。因此,您经常会发现自己试图解析显然不正确的 HTML,但在浏览器中却可以正常工作。
您可能能够使用 RE 解析错误的 HTML。它所需要的只是耐心和努力工作。但是使用别人的解析器通常更简单。
正如 Avi 已经指出的那样,这对于正则表达式来说太复杂了。使用get_text
fromBeautifulSoup
或clean_html
fromnltk
从您的 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 解析器会以不同程度的成功完成这项工作,因此您应该进行试验,看看哪种方法最适合您的输入数据。
我对 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 >