如何使用Beautiful Soup查找更改ID的标签?

时间:2012-08-12 17:13:30

标签: python regex beautifulsoup

我在Python中使用Beautiful Soup。

以下是一个示例网址:

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> 

我已经访问了同一网站上的其他网址,并且每次都找到了几乎相同的电话号码标识。始终保持不变的部分是:

'value_xxx_c_1_f_8_a_'

然而,之后的数字总是会改变。有没有办法可以告诉Beautiful Soup寻找id的一部分并匹配它,让其他部分成为正则表达式的数字呢?

另外,一旦我拿到了标签,我就想知道......如何在不使用正则表达式的情况下提取电话号码?我不知道Beautiful Soup是否可以做到这一点,但它可能比正则表达式更简单。

4 个答案:

答案 0 :(得分:3)

您可以使用正则表达式(此示例匹配标记名称,您需要调整它以使其匹配元素的ID):

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

答案 1 :(得分:2)

了解您的文档

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

soup.findAll(id=re.compile("para$"))
# [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>,
#  <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>]

答案 2 :(得分: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正则表达式匹配快一个数量级。

答案 3 :(得分:-1)

要获取电话号码,您可以使用.text属性。

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