0

我在 python 中使用正则表达式从这一行的 HTML 中获取以下数据:

<td xyz="123"><a href="blah.html">This is a line</a></td>

问题是在上面的 td 行中,xyz="123"and<a href>是可选的,所以它不会出现在所有的表格单元格中。所以我可以有这样的 tds:

<tr><td>New line</td></tr>
<tr><td xyz="123"><a href="blah.html">CaptureThis</a></td></tr>

我这样写正则表达式:

<tr><td x?y?z?=?"?(\d\d\d)?"?>?<?a?.*?>?(.*?)?<?/?a?>?</td></tr>

我基本上想从每个 tr 中的所有 td 中捕获“123”数据(如果存在)和“CaptureThis”数据。

此正则表达式不起作用,并且正在跳过没有“xyz”数据的​​行。

我知道在这里使用正则表达式不是合适的解决方案,但想知道是否可以单独使用正则表达式。

4

3 回答 3

2

您正在使用正则表达式,并且将 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-10T07:59:42.623 回答
0

你介意两次解析xml文件吗?使用正则表达式解决起来要简单得多,但可能会出现意想不到的问题,因为这不是正确的方法。

'' 匹配 td 单元格中的参数 '>([\w\s]+)<' 匹配“CaptureThis”数据

>>> line1
'<tr><td>New line</td></tr>'
>>> line2
'<tr><td xyz="123"><a href="blah.html">CaptureThis</a></td></tr>'  
>>> pattern2 = re.compile(r'>([\w\s]+)<')
>>> pattern2.search(line1).group(1)
'New line'
>>> pattern2.search(line2).group(1)
'CaptureThis'

>>> pattern = re.compile(r'<td\s+\w+="([^"]*)">')
>>> pattern.search(line2).group(1)
'123'

虽然没有完全测试。

于 2012-09-10T08:46:23.820 回答
0

以下代码在整个字符串中搜索匹配项并列出所有匹配项(即使有多个匹配项)。

>>> text = '''<tr><td>New line</td></tr>
<tr><td xyz="123"><a href="blah.html">CaptureThis</a></td></tr>
<tr><td xyz="456">CaptureThisAlso</td></tr>
'''

>>> re.findall(r'<tr><td(?: xyz="(\d+)")?>(?:<a href=".*?">)?(.*?)(?:</a>)?</td></tr>', text)
[('', 'New line'), ('123', 'CaptureThis'), ('456', 'CaptureThisAlso')]
于 2012-09-10T10:18:27.750 回答