首页 > 解决方案 > 根据容器中的元素获取副标题文本

问题描述

这是我被这段重复的代码部分困住的地方:

<span class="help-block"></span>
<h5 class="omb_authTitle">prettyname </h5>
<div class="input-group">
    <span class="input-group-addon"><i class="fa fa-check size_listing"></i></span>
    <select class="form-control" id="id_uglyname" name="uglyname">
        <option value=""></option>
        <option selected="" value="Yes">yes</option>
        <option value="No">No</option>
    </select>
</div>

我使用 Beautifulsoup 创建字典,如下所示:

{'uglyname' : 'Yes'}

我使用 select_one 从列表中搜索了name属性,然后获取下拉菜单的选定值。

但我更想要的是h5作为键的文本,如下所示:

{'prettyname': 'Yes'}

h5我怎样才能从 中的那个唯一名称转到那个特定的div

谢谢!

标签: pythonhtmlweb-scrapingbeautifulsoup

解决方案


您可以使用:has()伪类。:has()将向前看,看看其中的选择器是否为真。在这里,我们以h5我们想要的元素为目标,在相邻兄弟div下查看,在div' 的直接select子级下查看并比较属性。:has()请注意,我们通过在选择器之前使用相邻的兄弟组合器来使用相对选择器+

from bs4 import BeautifulSoup

html = """
<span class="help-block"></span>
<h5 class="omb_authTitle">prettyname </h5>
<div class="input-group">
    <span class="input-group-addon"><i class="fa fa-check size_listing"></i></span>
    <select class="form-control" id="id_uglyname" name="uglyname">
        <option value=""></option>
        <option selected="" value="Yes">yes</option>
        <option value="No">No</option>
    </select>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')

print(soup.select_one('h5:has(+ div > select[name=uglyname])'))

输出

<h5 class="omb_authTitle">prettyname </h5>   

推荐阅读