如何使用 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
属性的<div>
标记,该属性以字符串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 动画