2012-03-23 80 views
1

可能重複:
RegEx match open tags except XHTML self-contained tagsPython的正則表達式 - 每提取表格單元格的內容

如果我有一個字符串,它看起來像......

"<tr><td>123</td><td>234</td>...<td>697</td></tr>" 

基本上一個有n個單元格的表格行。

Python中獲取每個單元格的值最簡單的方法是什麼?那就是我只想將列表或數組中存儲的值「123」,「234」,「697」或最簡單的值。

我試圖使用正則表達式,當我使用

re.match 

我不能讓它發現任何東西。如果我嘗試用

re.search 

我只能得到第一個單元格。但我想要所有的細胞。如果我不能用n個單元來做到這一點,你會如何用固定數量的單元來做到這一點?

回答

5

如果該標記是一組較大標記的一部分,則應該使用帶HTML解析器的工具。
一個這樣的工具是BeautifulSoup
這裏找到你所需要使用什麼工具的一種方式:

>>> markup = '''"<tr><td>123</td><td>234</td>...<td>697</td></tr>"''' 
>>> from bs4 import BeautifulSoup as bs 
>>> soup = bs(markup) 
>>> for i in soup.find_all('td'): 
...  print(i.text) 

結果:

 
123 
234 
697 
+0

你可以建議更換爲BeautifulSoup一個很好的教程,所以我可以用它來獲取所有的細胞,逐行?謝謝 – 2012-03-23 02:07:57

+0

該文檔非常好,包含幾個示例:http://www.crummy.com/software/BeautifulSoup/bs4/doc/ – bernie 2012-03-23 02:08:28

0

不要這樣做。只需使用適當的HTML解析器,並使用xpath之類的東西來獲取所需的元素。

很多人喜歡lxml。對於這項任務,您可能需要使用BeautifulSoup後端,或直接使用BeautifulSoup,因爲這可能不是來自已知生成格式良好的有效文檔的源的標記。

+0

我喜歡xml.etree.cElementTree – Vayn 2012-03-23 02:05:55

+0

@Vayn,對於已知良好的標記是偉大的。 – Marcin 2012-03-23 02:06:37

+0

@Vayn:你會寫一個答案向我們展示如何使用'xml.etree.cElementTree'? :D – bernie 2012-03-23 02:06:46

0

當使用lxml的元素樹被創建。元素樹中的每個元素都包含有關標籤的信息。

from lxml import etree 
root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>") 
elements = root.findall(".//a") 
tag = elements[0].tag 
attr = elements[0].attr 

我沒有安裝這臺計算機上LXML,我不完全相信你添加什麼元素的結束得到一個ATTR。如果.attr不起作用,你將不得不穀歌谷歌用什麼來獲取一個元素的attr。