如何使用 Beautiful Soup 查找 id 变化的标签?

Posted

技术标签:

【中文标题】如何使用 Beautiful Soup 查找 id 变化的标签?【英文标题】:How to use Beautiful Soup to find a tag with changing id? 【发布时间】:2012-08-09 01:58:16 【问题描述】:

我在 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 是否可以做到这一点,但它可能比正则表达式更简单。

【问题讨论】:

【参考方案1】:

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

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

这只会匹配带有id 属性的&lt;div&gt; 标记,该属性以字符串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 正则表达式匹配快一个数量级。

【讨论】:

【参考方案2】:

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

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

【讨论】:

你确定要转义_吗?【参考方案3】:

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

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

【讨论】:

此处完全无关,回答前请阅读问题【参考方案4】:

了解您的文档

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>]

【讨论】:

以上是关于如何使用 Beautiful Soup 查找 id 变化的标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Beautiful Soup 提取此 HTML 元素属性的值?

使用 Beautiful soup 从多个 svg 帧创建循环 svg 动画

Beautiful Soup4库文档学习

Beautiful Soup 4.2.0 文档

Python 3 Beautiful Soup 用冒号查找标签

python爬虫之解析库Beautiful Soup