BeautifulSoup: получить текст, создать словарь - PullRequest
0 голосов
/ 07 ноября 2018

Я собираю информацию об исследовательских публикациях центрального банка. Пока что для Федерального резерва у меня есть следующий код Python:

START_URL = 'https://ideas.repec.org/s/fip/fedgfe.html'
page = requests.get(START_URL)
soup = BeautifulSoup(page.text, 'html.parser')
for paper in soup.findAll("li",class_="list-group-item downfree"):
    print(paper.text)

Это дает следующее для первой из многих публикаций:

2018-070 Надежное вычисление нелинейной динамической стохастической модели Решения: алгоритм с формулами ошибок. Гэри С. Андерсон

Теперь я хочу преобразовать это в словарь Python, который в конечном итоге будет содержать большое количество статей:

Papers = {
  'Date': 2018 - 070,
  'Title': 'Reliably Computing Nonlinear Dynamic Stochastic Model Solutions: An Algorithm with Error Formulas',
  'Author/s': 'Gary S. Anderson'
  }

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

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

  • [-\d]+ строка имеет только номер и -
  • (?<=\s).*?(?=by) строка начинается с пробела и заканчивается символом (который начинается с автора)
  • (?<=by\s).* автор, остаток всей строки

Полный код

import requests 
from bs4 import BeautifulSoup
import re

START_URL = 'https://ideas.repec.org/s/fip/fedgfe.html'
page = requests.get(START_URL,verify=False)
soup = BeautifulSoup(page.text, 'html.parser')
datas = []
for paper in soup.findAll("li",class_="list-group-item downfree"):
    data = dict()
    data["date"] = re.findall(r"[-\d]+",paper.text)[0]
    data["Title"] = re.findall(r"(?<=\s).*?(?=by)",paper.text)[0]
    data["Author(s)"] = re.findall(r"(?<=by\s).*",paper.text)[0]
    print(data)
    datas.append(data)
0 голосов
/ 07 ноября 2018

Я получаю хорошие результаты, извлекая всех потомков и выбираю только тех, которые NavigableStrings . Обязательно импортируйте NavigableString из bs4. Я также использую понятный список, но вы также можете использовать циклы for.

START_URL = 'https://ideas.repec.org/s/fip/fedgfe.html'
page = requests.get(START_URL)
soup = BeautifulSoup(page.text, 'html.parser')

papers = []
for paper in soup.findAll("li",class_="list-group-item downfree"):
    info = [desc.strip() for desc in paper.descendants if type(desc) == NavigableString]
    papers.append({'Date': info[0], 'Title': info[1], 'Author': info[3]})

print(papers[1])

{'Date': '2018-069',
 'Title': 'The Effect of Common Ownership on Profits : Evidence From the U.S. Banking Industry',
 'Author': 'Jacob P. Gramlich & Serafin J. Grundl'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...