0

如何从部分 html 文本中提取不是 html 标记的所有内容?

也就是说,如果我有以下类型:

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

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

我想到了正则表达式:

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

但它不会包含我需要的特殊字符和中文或希伯来文字符

4

3 回答 3

3

你应该看看像正则表达式这样的东西来从 HTML 中提取文本

从那个帖子:

您无法真正使用正则表达式解析 HTML。这太复杂了。RE 不会处理将在浏览器中作为正确的文本工作,但可能会使天真的 RE 感到困惑。

使用适当的 HTML 解析器,您会更快乐、更成功。Python 人经常使用 Beautiful Soup 来解析 HTML 并去除标签和脚本。

此外,浏览器在设计上允许格式错误的 HTML。因此,您经常会发现自己试图解析显然不正确的 HTML,但在浏览器中却可以正常工作。

您可能能够使用 RE 解析错误的 HTML。它所需要的只是耐心和努力工作。但是使用别人的解析器通常更简单。

于 2013-02-07T19:19:04.543 回答
1

正如 Avi 已经指出的那样,这对于正则表达式来说太复杂了。使用get_textfromBeautifulSoupclean_htmlfromnltk从您的 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 解析器会以不同程度的成功完成这项工作,因此您应该进行试验,看看哪种方法最适合您的输入数据。

于 2013-02-07T19:20:39.373 回答
-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 >
于 2013-02-07T19:23:52.597 回答