是否可以在单个soup.find_all
函数中使用多个参数来查找某些元素中的任何特定项?如果我选择soup.select
选项,我可以轻松应用我想知道的过程。更具体一点:看下面的例子:
from bs4 import BeautifulSoup
html_element='''
<div class="browse-movie-bottom">
<a href="https://yts.ag/movie/logan-lucky-2017" class="browse-movie-title">Logan Lucky</a>
<div class="browse-movie-year">2017</div>
<div class="browse-movie-tags">
<a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 720p</a>
<a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 1080p</a>
</div>
</div>
'''
soup = BeautifulSoup(html_element,"lxml")
for item in soup.find_all(class_='browse-movie-bottom')[0].find_all(class_='browse-movie-tags')[0].find_all("a"):
# for item in soup.select(".browse-movie-bottom .browse-movie-tags a"):
print(item.text)
一方面,我使用soup.select()
解析了电影标签,您知道这些标签可以这样使用,以便所有参数可以放在一个支架中。
另一方面,我使用soup.find_all()
做了同样的事情,它在三个不同的括号中需要三个不同的参数。结果虽然相同。
我的问题是:是否可以使用soup.find_all()
函数创建任何表达式,这将在单个大括号中包含多个参数,就像我对soup.select()
所做的那样。如下所示:
这是一个错误的,但它会让你知道我在追求什么类型的表达:
soup.find_all({'class':'browse-movie-bottom'},{'class':'browse-movie-tags'},"a")[0]
但是,有效的搜索结果是:
Logan Lucky 720p
Logan Lucky 1080p
答案 0 :(得分:0)
您应该使用CSS选择器:
>>> soup.select(".browse-movie-bottom .browse-movie-tags a")
[<a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 720p</a>, <a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 1080p</a>]
>>> [item.text for item in soup.select(".browse-movie-bottom .browse-movie-tags a")]
[u'Logan Lucky 720p', u'Logan Lucky 1080p']
更多信息:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors
除非您对CSS选择器无法做到(因为并非所有这些都已实现),否则您应该使用select
。否则,请使用更繁琐的find_all
。
未实现的CSS选择器示例:第n个子项。 selecting second child in beautiful soup with soup.select?
答案 1 :(得分:0)
您可以将列表传递给class_
属性,这样您就可以将一个电话保存到find_all
,但是您需要使用"a"
再次拨打电话,而且总是可以像soup("a")
使用find_all
的快捷方式:
from bs4 import BeautifulSoup
html_element='''
<div class="browse-movie-bottom">
<a href="https://yts.ag/movie/logan-lucky-2017" class="browse-movie-title">Logan Lucky</a>
<div class="browse-movie-year">2017</div>
<div class="browse-movie-tags">
<a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 720p</a>
<a href="https://yts.ag/torrent/download" rel="nofollow" title="Logan Lucky">Logan Lucky 1080p</a>
</div>
</div>
'''
soup = BeautifulSoup(html_element,"lxml")
for item in soup.findAll(class_=['browse-movie-bottom', 'browse-movie-tags'])[1]('a'):
#for item in soup.select(".browse-movie-bottom .browse-movie-tags a"):
print(item.text)