【问题标题】:Beautiful Soup trouble getting nested HTMLBeautiful Soup 遇到嵌套 HTML 的麻烦
【发布时间】:2019-01-11 20:44:42
【问题描述】:

使用 Beautiful soup,我似乎无法捕获所有 HTML 元素。具体来说,我的目标是尝试在

中获取 4
    <button class="css-812ha7 " type="button">4</button>

但是我在使用漂亮的汤时遇到了麻烦,因为我无法捕获嵌套标签

代码:

soup.select('.css-rs2cuv')

返回:

[
     <div class="css-rs2cuv">
         <button class="css-rzdbbc" type="button">
             <svg class="css-1jc5boz" viewbox="0 95 57 95">
                 <path d="M57 142.5L9.5"></path>
             </svg>
         </button>
         <button class="css-rzdbbc" type="button">
             <svg class="css-15yx468" viewbox="0 95 57 95">
                 <path d="M57 142.5L9.5 95 0 104.5l38"></path>
             </svg>
         </button>
     </div>
]

我以为我的代码行会返回所有标签和嵌套标签,然后我可以运行更多方法来获取我想要的值

我正在解析的 HTML:

<div class="css-rs2cuv">
    <button class="css-rzdbbc" type="button">
        <svg viewBox="0 95 57 95" class="css-1jc5boz">
             <path d="M57 142.5L9.5"></path>
        </svg>
    </button>
    <button class="css-10po51q " type="button">1</button>
    <button class="css-812ha7 " type="button">2</button>
    <button class="css-812ha7 " type="button">3</button>
    <div class="css-ufx8pa " data-comp="Flex Box">...</div>
    <button class="css-812ha7 " type="button">4</button>
    <button class="css-mnn3vx " type="button">
        <svg viewBox="0 95 57 95" class="css-15yx468 ">
            <path d="M57 142.5L9.5 95 0 104.5l38"></path>
        </svg>
    </button>
</div>

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    select 返回与该标签匹配的所有标签的列表。您可以使用此列表的索引来获取所需的标签,然后使用.text 获取其中的文本。

    from bs4 import BeautifulSoup
    html="""
    <div class="css-rs2cuv">
        <button class="css-rzdbbc" type="button">
            <svg viewBox="0 95 57 95" class="css-1jc5boz">
                 <path d="M57 142.5L9.5"></path>
            </svg>
        </button>
        <button class="css-10po51q " type="button">1</button>
        <button class="css-812ha7 " type="button">2</button>
        <button class="css-812ha7 " type="button">3</button>
        <div class="css-ufx8pa " data-comp="Flex Box">...</div>
        <button class="css-812ha7 " type="button">4</button>
        <button class="css-mnn3vx " type="button">
            <svg viewBox="0 95 57 95" class="css-15yx468 ">
                <path d="M57 142.5L9.5 95 0 104.5l38"></path>
            </svg>
        </button>
    </div>
    """
    soup=BeautifulSoup(html,'html.parser')
    print(soup.select('.css-812ha7')[2].text)
    

    输出

    4
    

    【讨论】:

    • 我使用了 lxml 解析器。这会有所作为吗?
    • @Liondancer 没有。我刚刚测试过。
    • 我试过 soup.select('.css-812ha7') 但我的代码返回 []
    • @Liondancer 我希望你得到了输出。
    【解决方案2】:

    没有足够的 html 来判断您是否需要使用 selectselect_oneselect_one 将返回第一个匹配项),但是对于显示的 html,您可以使用所需元素之前的属性之间的关系(通过指定 [data-comp='Flex Box']) 的 attribute=value selector,与您要抓取的元素的类相邻的兄弟组合。 +adjacent sibling combinator

    对于这个 css 选择器组合有多个匹配项,如果不是第一个,select 可用于检索所有匹配项;您可以对其进行索引以检索特定项目。

    在这种情况下,单独使用类名作为选择器几乎肯定会更快,但值得留意其他方法。

    from bs4 import BeautifulSoup
    html="""
    <div class="css-rs2cuv">
        <button class="css-rzdbbc" type="button">
            <svg viewBox="0 95 57 95" class="css-1jc5boz">
                 <path d="M57 142.5L9.5"></path>
            </svg>
        </button>
        <button class="css-10po51q " type="button">1</button>
        <button class="css-812ha7 " type="button">2</button>
        <button class="css-812ha7 " type="button">3</button>
        <div class="css-ufx8pa " data-comp="Flex Box">...</div>
        <button class="css-812ha7 " type="button">4</button>
        <button class="css-mnn3vx " type="button">
            <svg viewBox="0 95 57 95" class="css-15yx468 ">
                <path d="M57 142.5L9.5 95 0 104.5l38"></path>
            </svg>
        </button>
    </div>
    """
    soup = BeautifulSoup(html,'lxml')
    print(soup.select_one("[data-comp='Flex Box'] + .css-812ha7").text)
    

    【讨论】:

    • 原来我的代码正在抓取页面源,而我的浏览器由于 JS 渲染而具有不同的源 =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多