2012-08-12 77 views
4

我在Python中使用美麗的湯。如何使用美麗的湯來找到更改ID的標籤?

下面是一個例子網址:

http://www.locationary.com/place/en/US/Ohio/Middletown/McDonald%27s-p1013254580.jsp

在HTML,也有標籤一堆,我可以指定找到哪些是自己的ID得到的唯一途徑。我唯一想找到的就是電話號碼。標籤是這樣的:

<td class="dispTxt" id="value_xxx_c_1_f_8_a_134242498">5134231582</td> 

我去了其他的URL在同一網站上,發現幾乎每一個時間的電話號碼標籤相同的ID。始終保持不變的部分是:

'value_xxx_c_1_f_8_a_' 

但是,之後出現的數字總是會發生變化。有沒有一種方法可以告訴美麗的湯尋找部分id並匹配它,讓其他部分像正則表達式那樣可以?

此外,一旦我得到標籤,我想知道...如何提取電話號碼,而不使用正則表達式?我不知道美麗的湯是否可以做到這一點,但它可能比正則表達式更簡單。

回答

3

您可以使用正則表達式(本例中的標籤名稱匹配,你需要那麼它元素的ID匹配進行調整):

import re 
for tag in soup.find_all(re.compile("^value_xxx_c_1_f_8_a_")): 
    print(tag.name) 
+2

你確定你需要轉義'_'嗎? – 2012-08-12 17:46:27

+0

你不需要。 – 2012-08-12 18:03:08

+0

謝謝,我已經更新了答案。 – 2012-08-13 09:04:16

0

您可以在這裏使用CSS Selectors來匹配屬性值前綴:

soup.select('div[id^="value_xxx_c_1_f_8_a_"]') 

這將只匹配<div>代碼與一個id屬性以字符串value_xxx_c_1_f_8_a_開始。

如果你願意切換到lxml相反,您可以使用XPath 1.0表達式來查找這些:

from lxml import etree 
doc = etree.parse(openfile) 
for elem in doc.xpath('//div[starts-with(@id, "value_xxx_c_1_f_8_a_")]'): 
    print elem.text 

使用一個LXML XPath表達式將是一個數量級比使用BeautifulSoup定期更快表達匹配。

-1

要獲得電話號碼,您可以使用.text屬性。

tag = soup.find("foo") 
phone_number = tag.text 
+0

這裏完全無關,請在回答之前閱讀問題 – 2012-08-12 17:56:06