获取与具有特定值的标签相同的父标签内的标签的值
Posted
技术标签:
【中文标题】获取与具有特定值的标签相同的父标签内的标签的值【英文标题】:Getting value of a tag inside the same parent tag as a tag with a particular value 【发布时间】:2021-12-07 16:12:51 【问题描述】:标题很拗口,但描述了我想要的。我正在使用 BeautifulSoup 解析 XML。我的XML格式如下:
<properties>
<place>
<house_id>12345</house_id>
<appliances>Fridge, Oven</appliances>
<price>350000</price>
</place>
<place>
<house_id>6789</house_id>
<appliances>Heater, Microwave, Fridge</appliances>
<price>870000</price>
</place>
</properties>
给定house_id
标记的特定值,我想要与该位置相对应的appliances
内部的文本。例如,给定12345
,我想返回Fridge, Oven
。我还没有找到使用 BeautifulSoup 的简单方法。
【问题讨论】:
您的 XML 格式不正确。它缺少根标签。 我只是展示它的 sn-p,哈哈,甚至不是我的问题的重点 因为您没有提供最小的可重现示例,所以这里不是最佳 XPath 表达式://place[house_id="12345"]/appliances
我现在加了一个
【参考方案1】:
根据您输入的 XML,以下 XPath 表达式将生成您需要的内容。
can we use XPath with BeautifulSoup?
XPath
/properties/place[house_id="12345"]/appliances
【讨论】:
x 路径并不理想,因为我刚刚向您展示了虚拟数据,实际上还有更多标签,有时缺少一些标签 我想在特定地点标签内找到 features 标签,而不需要为其硬编码路径。 这也不能回答我的问题,因为 BeautifulSoup 不支持 xpath。 我的回答有给你的链接【参考方案2】:您可以使用General Sibling Combinator (~
):
soup.select_one("house_id:-soup-contains('12345') ~ appliances").text
或者你可以找到包含特定文本的<house_id>
标签,然后调用find_next()
定位<appliances>
标签:
print(soup.find("house_id", text="12345").find_next("appliances").text)
【讨论】:
谢谢!如果设备不是直接下一个标签,但可能是一些向下或几个以前的标签,这会起作用吗?我只是提供了虚拟数据来描述我的问题,实际上它不会直接出现在下一个,可能是一些标签向上或超过它 @user3611 我认为它应该可以工作,即使它不是直接下一个。如果是向上的,你可以使用find_previous()
而不是find_next()
【参考方案3】:
即使<appliances>
标记位于<house_id>
之前或之后,这也将起作用。
使用findParent()
查找<house_id>
的父级,然后在该父级中找到标记<appliances>
。
这里是代码
from bs4 import BeautifulSoup
s = """
<properties>
<place>
<house_id>12345</house_id>
<appliances>Fridge, Oven</appliances>
<price>350000</price>
</place>
<place>
<house_id>6789</house_id>
<appliances>Heater, Microwave, Fridge</appliances>
<price>870000</price>
</place>
<place>
<appliances>Oven, Cleaner, Microwave</appliances>
<price>700000</price>
<house_id>1296</house_id>
</place>
</properties>"""
soup = BeautifulSoup(s, 'xml')
def get_appliance(t, soup):
h = soup.find('house_id', text=t)
appliance = h.findParent().find('appliances')
return appliance.text
print(get_appliance('12345', soup))
print(get_appliance('1296', soup))
Fridge, Oven
Oven, Cleaner, Microwave
【讨论】:
以上是关于获取与具有特定值的标签相同的父标签内的标签的值的主要内容,如果未能解决你的问题,请参考以下文章