Разбор вложенных тегов с BeautifulSoup и запросов - PullRequest
1 голос
/ 18 апреля 2019

Я новичок в BeautifulSoup. Я пытался разобрать веб-страницу HTML с requests. Код, который я написал на данный момент:

import requests
from bs4 import BeautifulSoup

link = "SOME_URL"
f = requests.get(link)
soup = BeautifulSoup(f.text, 'html.parser')
for el in (soup.findAll("td",{"class": "g-res-tab-cell"})):
    print(el)
    exit

Вывод выглядит следующим образом:

<td class="g-res-tab-cell">
    <div style="padding:8px;">
        <div style="padding-top:8px;">
            <table cellspacing="0" cellpadding="0" border="0" style="width:100%;">
                <tr>
                    <td valign="top">
                        <div itemscope itemtype="URL">
                            <table cellspacing="0" cellpadding="0" style="width:100%;">
                                <tr>
                                    <td valign="top" class="g-res-tab-cell" style="width:100%;">
                                        <div style="width:100%;padding-left:4px;">
                                            <div class="subtext_view_med" itemprop="name">
                                                <a href="NAME1-URL" itemprop="url">NAME1</a>
                                            </div>
                                            <div style="direction:ltr;padding-left:5px;margin-bottom:2px;" class="smtext">
                                                <span class="Gray">In English:</span> ENGLISH_NAME1
                                            </div>
                                            <div style="padding-bottom:2px;padding-top:8px;font-size:14px;text-align:justify;min-height:158px;" itemprop="description">DESCRIPTION1</div>
                                        </div>
                                    </td>
                                </tr>
                            </table>
                        </div>
                    </td>
                </tr>
            </table>
            <table cellspacing="0" cellpadding="0" border="0" style="width:100%;">
                <tr>
                    <td valign="top">
                        <div itemscope itemtype="URL">
                            <table cellspacing="0" cellpadding="0" style="width:100%;">
                                <tr>
                                    <td valign="top" class="g-res-tab-cell" style="width:100%;">
                                        <div style="width:100%;padding-left:4px;">
                                            <div class="subtext_view_med" itemprop="name">
                                                <a href="NAME2-URL" itemprop="url">NAME2</a>
                                            </div>
                                            <div style="direction:ltr;padding-left:5px;margin-bottom:2px;" class="smtext">
                                                <span class="Gray">In English:</span> ENGLISH_NAME2
                                            </div>
                                        </div>
                                        <div style="padding-bottom:2px;padding-top:8px;font-size:14px;text-align:justify;min-height:158px;" itemprop="description">DESCRIPTION2</div>
                                    </td>
                                </tr>
                            </table>
                        </div>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</td>

Теперь я застрял. Я пытаюсь разобрать NAME, DESCRIPTION и ENGLISH_NAME для каждого блока. Я хотел бы напечатать каждый из них, чтобы вывод был:

name = NAME1
en_name = ENGLISH_NAME1
description = DESCRIPTION1
name = NAME2
en_name = ENGLISH_NAME2
description = DESCRIPTION2

Я пытался читать документы, но не мог найти, как обращаться с вложенными атрибутами, особенно без class или id имени. Как я понимаю, каждый блок начинается с <table cellspacing="0" cellpadding="0" border="0" style="width:100%;">. В каждом блоке я должен найти тег a, который имеет itemprop="url" и получить NAME. Затем в <span class="Gray">In English:</span> получите en_name и в itemprop="description" получите description. Но я чувствую, что BeautifulSoup не может этого сделать (или, по крайней мере, очень трудно добиться этого). Как это решить?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Вот другой способ. Поскольку эта информация присутствует для всех фильмов, у вас должен быть полностью заполненный набор результатов.

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd
r = requests.get('https://www.sratim.co.il/browsenewmovies.php?page=1')
soup = bs(r.content, 'lxml')
names = [item.text for item in soup.select('[itemprop=url]')]  #32
english_names = [item.next_sibling for item in soup.select('.smtext:contains("In English: ") span')]
descriptions = [item.text for item in soup.select('[itemprop=description]')]
results = list(zip(names, english_names, descriptions))
df = pd.DataFrame(results, columns = ['Name', 'English_Name', 'Description'])
print(df)
0 голосов
/ 18 апреля 2019

Вы можете перебирать каждый td с классом g-res-tab-cell, используя soup.find_all:

from bs4 import BeautifulSoup as soup
d = soup(content, 'html.parser').td.find_all('td', {'class':'g-res-tab-cell'})
results = [[i.find('div', {'class':'subtext_view_med'}).a.text, i.find('div', {'class':'smtext'}).contents[1].text, i.find('div', {'itemprop':'description'}).text] for i in d]

Выход:

[['NAME1', 'In English:', 'DESCRIPTION1'], ['NAME2', 'In English:', 'DESCRIPTION2']]

Редактировать: по ссылке:

import requests
from bs4 import BeautifulSoup as soup
d = soup(requests.get('https://www.sratim.co.il/browsenewmovies.php?page=1').text, 'html.parser')
movies = d.find_all('div', {'itemtype':'http://schema.org/Movie'})
result = [[getattr(i.find('a', {'itemprop':'url'}), 'text', 'N/A'), getattr(i.find('div', {'class':'smtext'}), 'text', 'N/A'), getattr(i.find('div', {'itemprop':'description'}), 'text', 'N/A')] for i in movies]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...