0

我在 python 中使用正则表达式从 html 中提取数据。我写的正则表达式是这样的:

result = re.findall(r'<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+|<td align="lef(.*?)" >(.*?)</td>\s+', webpage)

假设这将遵循以下任一格式的 td -

<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+

或者

<td align="lef(.*?)" >(.*?)</td>

这是因为 td 可以在该特定单元格中采用不同的格式(或者有带有链接的数据,或者甚至根本没有数据)。

我假设我使用的 OR 条件不正确 - 相信 OR 仅匹配正则表达式前面的“just”和正则表达式后面的“just”,而不是两个完整的 td 标签之间。

我的问题是,我如何对它进行分组(例如用括号),以便 OR 在整个 td 标签之间匹配。

4

2 回答 2

3

您正在使用正则表达式,但是将 XML 与此类表达式匹配变得太复杂、太快。

改用 HTML 解析器,Python 有几个可供选择:

元素树示例:

from xml.etree import ElementTree

tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
    print ElementTree.tostring(elem)
于 2012-09-10T15:07:59.973 回答
0

In <td align="left" csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+ the .?* should be replaced with .*?.

And, to answer your question, you can use non-capturing grouping to do what you want as follows:

(?:first_regex)|(?:second_regex)

BTW. You can also replace \d\d\d\d with \d{4}, which I think is easier to read.

于 2012-09-10T15:41:01.200 回答