BeautifulSoup, как использовать для циклов и извлечения конкретных данных? - PullRequest
0 голосов
/ 11 января 2019

HTML-код ниже взят с веб-сайта, посвященного обзорам фильмов. Я хочу извлечь звезды из кода ниже, который будет John C. Reilly, Sarah Silverman и Gal 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 голосов
/ 11 января 2019

Вы можете перебрать все теги 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']

Edit:

_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']
0 голосов
/ 11 января 2019

Вы также можете использовать регулярное выражение

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']
0 голосов
/ 11 января 2019

Я покажу, как это реализовать, и вижу, что вам нужно всего лишь изучить синтаксис BeautifulSoap.

Сначала мы хотим использовать этот метод findAll для тега "div" с атрибутом "class".

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, только суп. Я надеюсь, что это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...