2012-09-10 24 views
0

我使用正則表達式中的python搶在此行中從HTML以下數據:正則表達式中蟒不採取指定的數據在TD元素

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

的問題是,在上面的TD線,則xyz="123"<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> 

我基本上要捕獲「123」的數據(如果存在的話)和「CaptureThis」從所有數據tds在每個tr。

這個正則表達式不起作用,並跳過沒有「xyz」數據的​​行。

我知道使用正則表達式不是這裏的合適解決方案,但想知道是否可以用正則表達式來完成。

+3

不要使用正則表達式來解析HTML! – hsz

+0

只要放一個?在每個可選字符不起作用之後,因爲這會引入許多(不需要的)可能性。您需要將多組可選部件分組。 – Veger

+0

Martijn的回答是正確的,無論如何,你不應該把所有這些'?'。 ( )我會寫一些像(未測試):')?(。*?)()?' – Bakuriu

回答

2

您正在使用正則表達式,並且將XML與這些表達式匹配得太複雜,太快。

使用HTML解析器來代替,Python有幾個選擇:

ElementTree的例子:

from xml.etree import ElementTree 

tree = ElementTree.parse('filename.html') 
for elem in tree.findall('tr'): 
    print ElementTree.tostring(elem) 
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' 

雖不全面測試。

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