Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的正则表达式未在td元素中获取指定数据_Python_Html_Regex - Fatal编程技术网

python中的正则表达式未在td元素中获取指定数据

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<

我在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</a></td></tr>
<tr><td x?y?z?=?"?(\d\d\d)?"?>?<?a?.*?>?(.*?)?<?/?a?>?</td></tr>
?(*?)??
我基本上希望从每个tr中的所有tds中捕获“123”数据(如果存在)和“CaptUratis”数据

此正则表达式不工作,正在跳过没有“xyz”数据的行


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

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

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

  • 是标准库的一部分
  • 是一个流行的第三方库
  • 是一个快速且功能丰富的基于C的库
ElementTree示例:

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')]