获取与具有特定值的标记在同一父标记内的标记值

2024-06-01 22:05:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这个标题很有意思,但描述了我想要的东西。我正在使用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。我还没有找到一个简单的方法来实现这一点


Tags: 标记id标题格式placexmlpropertiesheater
3条回答

您可以使用General Sibling Combinator~):

soup.select_one("house_id:-soup-contains('12345') ~ appliances").text

或者,您可以找到包含特定文本的<house_id>标记,然后调用^{}查找<appliances>标记:

print(soup.find("house_id", text="12345").find_next("appliances").text)

根据您的输入XML,下面的XPath表达式将生成您需要的内容

can we use XPath with BeautifulSoup?

XPath

/properties/place[house_id="12345"]/appliances

即使<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

相关问题 更多 >