2010-08-15 31 views
0

一個網頁有一個產品代碼,我需要以檢索,它是在下面的HTML部分:幫助使用美麗的湯檢索從HTML產品代碼

<table...> 
<tr> 
<td> 
<font size="2">Product Code#</font> 
<br> 
<font size="1">2342343</font> 
</td> 

</tr> 
</table> 

所以我想這樣做,這將是最好的方式首先引用文本值爲「Product Code#」的html元素,然後引用TD中的第二個字體標籤。

想法?

+2

我很驚訝於有多少人無法讀取問題的「BeautifulSoup」的一部分。 – icktoofay 2010-08-15 04:59:10

回答

1

我的策略是:

  • 查找與字符串「Product Code#」匹配的文本節點
  • 對於每個這樣的節點,獲取父節點<font>元素並找到父節點的下一個兄弟節點<font>元素
  • 插入兄弟元素的內容到一個列表

代碼:

from BeautifulSoup import BeautifulSoup 


html = open("products.html").read() 
soup = BeautifulSoup(html) 

product_codes = [tag.parent.findNextSiblings('font')[0].contents[0] 
       for tag in 
       soup.findAll(text='Product Code#')] 
0

你可以使用這個表達式(或類似的東西):

<td>\n\ <font\ size="2">Product\ Code\#</font>\n\ <br>\n\ <font\ size="1">(?<ProductCode>.+?)</font>\n\ </td>

你也許可以刪除一些根據您的正則表達式引擎逃逸......我是持謹慎態度。

1

假設soup是你BeautifulSoup例如:

int(''.join(soup("font", size="1")[0](text=True))) 

或者,如果你需要得到多個產品代碼:

[int(''.join(font(text=True))) for font in soup("font", size="1")] 
+0

如果還有其他'size =「1」'列,則失敗。 – PaulMcG 2010-08-15 12:56:50

+0

@Paul:是的,但沒有,並且如果有必要的話,它可能會被限制在表格中。 – icktoofay 2010-08-20 01:41:00

0

不要使用正則表達式來解析HTML。我會用下面的XPath完成這個任務:

//TABLE/TR/TD/FONT[@size='1'] 

或者,如果字體大小屬性不能保證在那裏,等於1:

//FONT[text()='Product Code#']/parent::*/FONT[2]