2

我想用正则表达式读取标签中的元素,例如:

<td>Stuff Here</td>
<td>stuff 
</td>

我正在使用以下内容:re.findall(re.compile('<td>(.*)</td>'), str(line).strip())

为什么我可以读取第一个<td>标签,而不能读取第二个标签?

4

2 回答 2

5

对于一般情况,您不能使用正则表达式来解析标记。你能做的最好的就是开始使用 HTML 解析器,那里有很多不错的选择,恕我直言Beautiful Soup是一个不错的选择。

于 2013-06-16T16:15:54.347 回答
2

首先,我假设它line包含整个 HTML 文档,而不是其名称所暗示的单行。

一个问题是,默认情况下,.与换行符不匹配:

In [3]: re.findall('.', '\n')
Out[3]: []

您要么需要删除嵌入的换行符(strip()顺便说一句),要么使用re.DOTALL

In [4]: re.findall('.', '\n', re.DOTALL)
Out[4]: ['\n']

此外,您应该将 更改.*.*?以使表达式非贪婪。

另一个更大的问题是基于正则表达式的方法不足以解析任意 HTML。请参阅RegEx match open tags except XHTML self-contained tags以获得很好的讨论。

于 2013-06-16T16:13:27.177 回答