Python 我如何在美丽的汤中潜水到多个层次(查找所有错误)
我试图在这个Python脚本中向下钻取两个级别。我看到的所有示例都使用find_All向下钻取了一个级别,我可以很好地实现这一点,但我无法向下钻取到第三个级别。以下是我的代码片段:Python 我如何在美丽的汤中潜水到多个层次(查找所有错误),python,python-3.x,beautifulsoup,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
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_内容变成了一个数组,所以我尝试这样做:
links = label_item_contents[].find_all("a")
但是我得到了“SyntaxError:无效语法”
感谢您的帮助
编辑:这是第二个示例中使用print(label\u item\u contents)时返回的HTML的一部分:
342.4K
233.4K
瑞典斯德哥尔摩
科技屋
,
我只想进入
不确定它是否正确,但为什么不这样做呢?您可以链接find
,以获得所需的子div:
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'))
html=”“”
342.4K
233.4K
瑞典斯德哥尔摩
科技屋
,
"""
soup=BeautifulSoup(html)
打印(soup.find('div',{'class':'block content'})。find('div',{'class':“label item description”})。find('a'))
输出:
<a href="/label/example.com"><strong>Example</strong></a>
您可能想尝试一下CSS选择器——我发现它们更熟悉,更重要的是,我发现它们导致的
属性错误问题更少
例如,使用上面的html
可以选择第一个锚定标记,如下所示:
link = soup.select("div.label-item-description > div > a")
print(link[0]) # <a href="/label/example.com"><strong>Example</strong></a>
link=soup.select(“div.label-item-description>div>a”)
打印(链接[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)
您还可以使用另外两种选择:
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/"]')]
发布你的html,这样我们就可以有一个idea@SebastienD当我使用print(label\u item\u contents)时生成的html?好吧,您用于您的soup变量的html,即:soup=BeautifulSoup(html)
还有很多其他的好方法,它们似乎工作得很好,并且去掉了我一半的代码!谢谢
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/"]')]