python中的正则表达式未在td元素中获取指定数据
我在python中使用regex从这一行的HTML中获取以下数据:python中的正则表达式未在td元素中获取指定数据,python,html,regex,Python,Html,Regex,我在python中使用regex从这一行的HTML中获取以下数据: <td xyz="123"><a href="blah.html">This is a line</a></td> 我这样写正则表达式: <tr><td>New line</td></tr> <tr><td xyz="123"><a href="blah.html">CaptureThis<
<td xyz="123"><a href="blah.html">This is a line</a></td>
我这样写正则表达式:
<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中的所有tds中捕获“123”数据(如果存在)和“CaptUratis”数据
此正则表达式不工作,正在跳过没有“xyz”数据的行
我知道在这里使用正则表达式不是一个合适的解决方案,但我想知道是否可以单独使用正则表达式来实现它。您使用的是正则表达式,而将XML与此类表达式匹配会变得太复杂、太快 请改用HTML解析器,Python有几个选项可供选择:
- 是标准库的一部分
- 是一个流行的第三方库
- 是一个快速且功能丰富的基于C的库
from xml.etree import ElementTree
tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
print ElementTree.tostring(elem)
您介意对xml文件进行两次解析吗?使用正则表达式解决问题要简单得多,但可能会出现意外问题,因为这不是正确的方法 “”以匹配td单元中的参数
“>([\w\s]+)([\w\s]+)以下代码搜索整个字符串中的匹配项并列出所有匹配项(即使有多个)
>>text=''新行
卡普图里萨索
'''
>>>关于findall(r'(?:)?',正文)
[('123','capturais'),('456','capturaisalso')]
不要使用正则表达式解析HTML!只是放了一个?之后,每个可选字符都不起作用,因为这会引入很多(不需要的)可能性。您需要将可选部件集分组。Martijn的答案是正确的,无论如何,您不应该只放所有这些“?”。我会写一些类似(未经测试的):()?(.*)()?
。
>>> 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'
>>> 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')]