5

我在 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> 

我访问了同一网站上的其他 URL,每次都发现电话号码标签的 ID 几乎相同。始终保持不变的部分是:

'value_xxx_c_1_f_8_a_'

但是,之后的数字总是会发生变化。有没有一种方法可以告诉 Beautiful Soup 查找 id 的一部分并匹配它,让另一部分像正则表达式一样是数字?

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

4

4 回答 4

4

您可以使用正则表达式(此示例匹配标签名称,您需要对其进行调整,使其与元素的 id 匹配):

import re
for tag in soup.find_all(re.compile("^value_xxx_c_1_f_8_a_")):
    print(tag.name)
于 2012-08-12T17:16:48.147 回答
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>]
于 2012-08-12T17:18:11.907 回答
0

您可以在此处使用CSS 选择器来匹配属性值前缀:

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

这只会匹配带有以字符串开头<div>的属性的标签。idvalue_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 正则表达式匹配快一个数量级。

于 2012-08-12T17:20:02.577 回答
-1

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

tag = soup.find("foo") 
phone_number = tag.text
于 2012-08-12T17:36:24.540 回答