如何在find_all函数中应用多个参数?

时间:2017-11-16 18:03:09

标签: python python-3.x web-scraping beautifulsoup

是否可以在单个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

2 个答案:

答案 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)