美丽的汤麻烦嵌套HTML

时间:2019-01-11 20:44:43

标签: python html beautifulsoup

使用美丽的汤,我似乎无法捕获所有HTML元素。具体来说,我旨在尝试在

中获取<img data-lazy="img/lazyfonz1.png"/> $('.lazy').slick({ lazyLoad: 'ondemand', slidesToShow: 3, slidesToScroll: 1 });
4

但是我无法使用漂亮的汤来做这件事,因为我无法捕获嵌套标签

代码:

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

返回:

soup.select('.css-rs2cuv')

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

我正在解析的HTML:

[
     <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>
]

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

没有足够的html来告诉您是否需要使用selectselect_oneselect_one将返回第一个匹配项),但是对于显示的html,您可以使用的属性之间的关系在所需同级元素之前的元素(通过指定[data-comp='Flex Box']的{​​{3}}),与您要抓取的元素类别相邻的同级组合中。 +attribute=value selector

此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)
相关问题