Извлеките информацию об академии c из ИДЕИ - PullRequest
0 голосов
/ 13 марта 2020

Я хочу извлечь список публикаций из заданной c страницы ИДЕЙ . Я хочу получить информацию о названии статьи, авторах и году. Тем не менее, я немного застрял в этом. Осматривая страницу, вся информация находится внутри div class="tab-pane fade show active" [...], затем с h3 мы имеем год публикации, а внутри каждого li class="list-group-item downfree" [...] мы можем найти каждую статью с относительным автором (как показано на этом изображении ). В конце я хочу получить блок данных, содержащий три столбца: заголовок, автор и год.

Тем не менее, хотя я могу получить название каждой статьи, когда я хочу добавить также год и авторов, я запутался. До сих пор я писал следующий короткий код:

from requests import get
url = 'https://ideas.repec.org/s/rtr/wpaper.html'
response = get(url)

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

containers = soup.findAll("div", {'class': 'tab-pane fade show active'})

title_list = []
year_list = []

for container in containers:

    year = container.findAll('h3')
    year_list.append(int(year[0].text))

    title_containers = container.findAll("li", {'class': 'list-group-item downfree'})
    title = title_containers[0].a.text
    title_list.append(title)  

Я получаю два списка по одному элементу в каждом. Это потому, что исходные контейнеры имеют размер 1. Относительно того, как получить имя автора (ов), я понятия не имею, я попытался несколькими способами без успеха. Я думаю, что я должен разделить заголовки, используя «как» в качестве разделителя.

Я надеюсь, что кто-то может мне помочь или перенаправить к другой дискуссии, которая сталкивается с подобной ситуацией. Заранее спасибо. Извиняюсь за мой (возможно) глупый вопрос, я все еще начинаю изучать веб-сайты с BeautifulSoup.

1 Ответ

2 голосов
/ 13 марта 2020

Вы можете получить желаемую информацию следующим образом:

from requests import get
import pprint
from bs4 import BeautifulSoup

url = 'https://ideas.repec.org/s/rtr/wpaper.html'
response = get(url)
soup = BeautifulSoup(response.text, 'html.parser')
container = soup.select_one("#content")
title_list = []
author_list = []
year_list = [int(h.text) for h in container.find_all('h3')]
for panel in container.select("div.panel-body"):
    title_list.append([x.text for x in panel.find_all('a')])
    author_list.append([x.next_sibling.strip() for x in panel.find_all('i')])
result = list(zip(year_list, title_list, author_list))

pp = pprint.PrettyPrinter(indent=4, width=250)
pp.pprint(result)

вывод:

[   (   2020,
        ['The Role Of Public Procurement As Innovation Lever: Evidence From Italian Manufacturing Firms', 'A voyage in the role of territory: are territories capable of instilling their peculiarities in local production systems'],
        ['Francesco Crespi & Serenella Caravella', 'Cristina Vaquero-Piñeiro']),
    (   2019,
        [   'Probability Forecasts and Prediction Markets',
            'R&D Financing And Growth',
            'Mission-Oriented Innovation Policies: A Theoretical And Empirical Assessment For The Us Economy',
            'Public Investment Fiscal Multipliers: An Empirical Assessment For European Countries',
            'Consumption Smoothing Channels Within And Between Households',
            'A critical analysis of the secular stagnation theory',
            'Further evidence of the relationship between social transfers and income inequality in OECD countries',
            'Capital accumulation and corporate portfolio choice between liquidity holdings and financialisation'],
        [   'Julia Mortera & A. Philip Dawid',
            'Luca Spinesi & Mario Tirelli',
            'Matteo Deleidi & Mariana Mazzucato',
            'Enrico Sergio Levrero & Matteo Deleidi & Francesca Iafrate',
            'Simone Tedeschi & Luigi Ventura & Pierfederico Asdrubal',
            'Stefano Di Bucchianico',
            "Giorgio D'Agostino & Luca Pieroni & Margherita Scarlato",
            'Giovanni Scarano']),
    (   2018, ...

Я получил годы, используя понимание списка. Я получил названия и авторов, добавив список в title_list и title_list для необходимых элементов в каждом элементе div с классом panel-body, снова используя понимание списка и используя next.sibling для элемента i, чтобы получить авторов. Затем я сжал три списка и бросил результат в список. Наконец я довольно распечатал результат.

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