如何在“美丽的汤”中下多个层次(find_all错误)

时间:2019-06-14 23:09:40

标签: python python-3.x beautifulsoup

我正在尝试在此Python脚本中深入研究两个级别。我看到的所有示例都使用find_all向下钻取一个级别,我可以正常工作,但是我无法下降到第三级。这是我的代码段:

main_table = soup.find("div",attrs={'class':'block-content'})
label_item_contents = main_table.find_all("div", attrs={'class':'label-item-description'})
links = label_item_contents.find_all("a")
print(links)

这样做会给我一个错误“ AttributeError:ResultSet对象没有属性'find_all'。”

如果我注释掉并更改了打印,就这样:

main_table = soup.find("div",attrs={'class':'block-content'})
label_item_contents = main_table.find_all("div", attrs={'class':'label-item-description'})
print(label_item_contents)

然后我看到所有已抓取的数据。我读到问题可能是label_item_contents变成了数组,所以我尝试这样做:

links = label_item_contents[].find_all("a")

但是随后我收到“ SyntaxError:无效语法”

感谢您的帮助!

编辑:这是第二个示例中我使用print(label_item_contents)返回的HTML的一部分:

<div class="label-item-description">
    <div>
        <a href="/label/example.com"><strong>Example</strong></a>
    </div>
    <small>
        <i class="fa fa-facebook-official"></i> 342.4K
        <i class="fa fa-soundcloud"></i> 233.4K
    </small>
    <br />
    <small class="text-muted">
        Stockholm, Sweden
    </small>
    <br />
    <small class="text-muted">
        <b>Techno, Tech House</b>
    </small>
</div>, <div class="label-item-description">

我正试图只去<a href="/label/example.com">

4 个答案:

答案 0 :(得分:2)

您可能想尝试一下CSS选择器-我发现它们更加熟悉,而且重要的是,我发现它们引起的AttributeError问题更少。

例如,使用上面的html,您可以选择第一个锚标记,如下所示:

link = soup.select("div.label-item-description > div > a")
print(link[0]) # <a href="/label/example.com"><strong>Example</strong></a>

查看文档:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

答案 1 :(得分:0)

不确定是否正确,但是为什么不这样做呢?您可以将find链接到所需的细分:

html= """
<div class="block-content">
    <div class="label-item-description">
        <div>
            <a href="/label/example.com"><strong>Example</strong></a>
        </div>
        <small>
            <i class="fa fa-facebook-official"></i> 342.4K
            <i class="fa fa-soundcloud"></i> 233.4K
        </small>
        <br />
        <small class="text-muted">
            Stockholm, Sweden
        </small>
        <br />
        <small class="text-muted">
            <b>Techno, Tech House</b>
        </small>
    </div>, <div class="label-item-description"></div>
</div>  """

soup=BeautifulSoup(html)
print(soup.find('div', {'class': 'block-content'}).find('div',  {'class':"label-item-description"}).find('a'))

输出:

<a href="/label/example.com"><strong>Example</strong></a>

答案 2 :(得分:0)

有时我们使用定位标记,但其中不包含href属性。

您可以尝试使用find_all函数,它总是返回一个列表,并使用带有锚标记的href=True属性将为您提供所有具有href属性的链接。

main_table = soup.find("div",{'class':'label-item-description'})
links = main_table.find_all("a",href=True)
print(links)

答案 3 :(得分:0)

您可能可以使用的另外两种选择:

links = [item['href'] for item in soup.select('.label-item-description a')]
links2 = [item['href'] for item in soup.select('.label-item-description [href^="/label/"]')]