我想用regex读取标签内的元素,例如:
<td>Stuff Here</td>
<td>stuff
</td>
我使用以下内容:re.findall(re.compile('<td>(.*)</td>'), str(line).strip())
为什么我可以阅读第一个<td>
标签,但不是第二个?{/ p>
答案 0 :(得分:5)
对于一般情况,您can't use regular expressions for parsing markup。你可以做的最好的事情是开始使用HTML解析器,那里有很多good options,恕我直言Beautiful Soup是一个不错的选择。
答案 1 :(得分:2)
首先,我假设line
包含整个HTML文档,而不仅仅是其名称所暗示的单行。
一个问题是,默认情况下,.
与换行符不匹配:
In [3]: re.findall('.', '\n')
Out[3]: []
您需要删除嵌入的换行符(strip()
不执行BTW),或使用re.DOTALL
:
In [4]: re.findall('.', '\n', re.DOTALL)
Out[4]: ['\n']
此外,您应该将.*
更改为.*?
以使表达式非贪婪。
另一个更大的问题是,基于正则表达式的方法不足以解析任意HTML。请参阅RegEx match open tags except XHTML self-contained tags进行讨论。