我在python中使用regex从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+
OR
<td align="lef(.*?)" >(.*?)</td>
这是因为td可以在该特定单元格中采用不同的格式(要么具有带链接的数据,要么根本没有数据)。
我假设我使用的OR条件不正确 - 相信OR只匹配正则表达式之前的“just”和正则表达式之后的“just”,而不是两个整个td标记之间的匹配。
我的问题是,如何对其进行分组(例如使用paranthesis),以便在整个td标记之间匹配OR。
答案 0 :(得分:3)
您正在使用正则表达式,但将XML与此类表达式匹配会变得太复杂,太快。
使用HTML解析器,Python有几种可供选择:
ElementTree示例:
from xml.etree import ElementTree
tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
print ElementTree.tostring(elem)
答案 1 :(得分:0)
在<td align="left" csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+
中,.?*
应替换为.*?
。
而且,要回答您的问题,您可以使用非捕获分组来执行您想要的操作,如下所示:
(?:first_regex)|(?:second_regex)
顺便说一句。您也可以将\d\d\d\d
替换为\d{4}
,我认为这更容易阅读。