2011-05-16 19 views
0

這裏是我想解析的html。從非唯一表上的html檢索字符串

<TD>Serial Number</TD><TD>AB12345678</TD> 

我正在嘗試使用正則表達式來解析數據。我聽說過BeautifulSoup,但在頁面上有大約50個這樣的項目都使用相同的表格參數,並且它們都沒有ID號碼。他們對唯一標識符最接近的是我需要的數據之前的單元格中的數據。

serialNumber = re.search("Serial Number</td><td>\n(.*?)</td>", source) 

源代碼只是使用urllib抓取的頁面的源代碼。在第二個和序列號之間的html中有新的行,但我不確定這是否重要。

+0

正則表達式是傳統的不明智的解決方案來解析HTML。你真的應該使用BeautifulSoup,只要(條件),下降到表中並獲取數據。否則,進入下一張桌子。你可以嘗試[scrapy](http://scrapy.org/)並使用它來編寫一個蜘蛛,它通常包含類似於正則表達式的東西 – inspectorG4dget 2011-05-16 19:27:00

+2

強制性鏈接:http://stackoverflow.com/questions/1732348/regex- match-open-tags-except-xhtml-self-contained-tags – Amadan 2011-05-16 19:32:21

回答

2

Pyparsing可以給你一個小更強大的提取爲您的數據:

from pyparsing import makeHTMLTags, Word, alphanums 

htmlfrag = """<blah></blah><TD>Serial Number</TD><TD> 
      AB12345678 
      </TD><stuff></stuff>""" 

td,tdEnd = makeHTMLTags("td") 

sernoFormat = (td + "Serial Number" + tdEnd + 
       td + Word(alphanums)('serialNumber') + tdEnd) 


for sernoData in sernoFormat.searchString(htmlfrag): 
    print sernoData.serialNumber 

打印:

AB12345678 

注意pyparsing不關心其中多餘的空格下降,並且還處理在定義的標記中可能出現的意想不到的屬性,標記內的空白,大寫/小寫的標記等。

+0

+1給出了一個關於如何使用解析器的例子,而不僅僅是通常的「使用解析器的html !!!」 – stema 2011-05-17 07:49:05

0

在大多數情況下,最好在html上工作使用適當的解析器,但在某些情況下,使用正則表達式完成作業完全可以。我不知道這是否是一個很好的解決方案足夠了解你的任務是判斷,或者最好是去@保羅的解決方案,但在這裏,我嘗試修復您的正則表達式:

serialNumber = re.search("Serial Number</td><td>(.*?)</td>", source, re.S | re.I) 

我刪除了\n ,因爲在我看來很難(\ n,\ r,\ r \ n,...),而我使用了選項re.S(Dotall)。

但請注意,現在如果有換行符,它將在您的捕獲組中!即你應該從結果中去掉空白區域。

你的正則表達式的另一個問題是你的字符串中的<TD>,但你搜索<td>。那裏是選項re.I(IgnoreCase)。

您可以找到有關正則表達式的更多的解釋here on docs.python.org

相關問題