BeautifulSoup如何用于循环并提取特定数据?

时间:2019-01-11 13:55:56

标签: python beautifulsoup

以下HTML代码来自有关电影评论的网站。我想从下面的代码中提取星星,它们分别是John C. ReillySarah SilvermanGal Gadot。我该怎么办?

代码:

html_doc = """
<html>
    <head>
    </head>
    <body>
    <div class="credit_summary_item">
                <h4 class="inline">Stars:</h4>
            <a href="/name/nm0000604/?ref_=tt_ov_st_sm">John C. Reilly</a>,
            <a href="/name/nm0798971/?ref_=tt_ov_st_sm">Sarah Silverman</a>,
            <a href="/name/nm2933757/?ref_=tt_ov_st_sm">Gal Gadot</a>
            <span class="ghost">|</span>
            <a href="fullcredits/?ref_=tt_ov_st_sm">See full cast & crew</a>&nbsp;&raquo;
        </div>
    </body>
</html>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

我的想法

我将使用for循环遍历每个div class,直到找到带有文本Stars的类,然后在其中提取名称。但是我不怎么编码,因为我对HTML语法和模块不太熟悉。

3 个答案:

答案 0 :(得分:1)

我将展示如何实现此功能,并看到您只需要学习BeautifulSoap语法。

首先,我们要对属性为“ class”的“ div”标签使用该方法findAll

divs = soup.findAll("div", attrs={"class": "credit_summary_item"})

然后,我们将过滤掉所有没有星号的div:

stars = [div for div in divs if "Stars:" in div.h4.text]

如果只有一个开始的地方,可以将其淘汰:

star = start[0]

然后再次找到标签“ a”中的所有文本

names = [a.text for a in star.findAll("a")]

您可以看到我没有使用任何html / css语法,只有汤。 希望对您有所帮助。

答案 1 :(得分:1)

您可以遍历a credit_summary_item中的所有div标签:

from bs4 import BeautifulSoup as soup
*results, _ = [i.text for i in soup(html_doc, 'html.parser').find('div', {'class':'credit_summary_item'}).find_all('a')]

输出:

['John C. Reilly', 'Sarah Silverman', 'Gal Gadot']

编辑:

_d = [i for i in soup(html_doc, 'html.parser').find_all('div', {'class':'credit_summary_item'}) if 'Stars:' in i.text][0]
*results, _ = [i.text for i in _d.find_all('a')]

输出:

['John C. Reilly', 'Sarah Silverman', 'Gal Gadot']

答案 2 :(得分:0)

您也可以使用regex

stars = soup.findAll('a', href=re.compile('/name/nm.+'))
names = [x.text for x in stars]
names

# output: ['John C. Reilly', 'Sarah Silverman', 'Gal Gadot']