如何使用for循环和提取特定数据?

2024-05-14 03:12:15 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的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语法和模块都不太熟悉。你知道吗


Tags: 代码namedivrefhtmljohnclasshref
3条回答

也可以使用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']

您可以迭代credit_summary_itemdiv中的所有a标记:

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']

我将展示如何实现这一点,并看到您只需要学习漂亮的usoap语法。你知道吗

首先,我们希望对属性为“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语法,只使用了soup。 我希望有帮助。你知道吗

相关问题 更多 >