#python #python-3.x #web-scraping
#python #python-3.x #веб-очистка
Вопрос:
Этот код выполняется и предоставляет несколько ссылок на данные с одного веб-сайта . В коде упоминается веб-сайт. Веб-сайт содержит данные из нескольких ссылок, которые затем сводятся в одну таблицу
Можете ли вы предложить, какие изменения были внесены в этот код, чтобы получить данные без импорта каких-либо дополнительных библиотек и свести их в таблицу?
#import libraries
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import urllib.request as ur
from bs4 import BeautifulSoup
s = ur.urlopen("https://financials.morningstar.com/ratios/r.html?t=AAPL")
s1 = s.read()
print(s1)
soup = BeautifulSoup(ur.urlopen('https://financials.morningstar.com/ratios/r.html?t=AAPL'),"html.parser")
title = soup.title
print(title)
text = soup.get_text()
print(text)
links = []
for link in soup.find_all(attrs={'href': re.compile("http")}):
links.append(link.get('href'))
print(links)
Ожидаемые результаты должны представлять собой табличную форму коэффициентов, перечисленных в списке, каждый из которых может быть указан как словарь, где ключ — это год, а значение — отношение
Комментарии:
1. Эти селекторы BeautifulSoup выглядят совсем не так. Прочитайте документы о том, как правильно выбирать элементы.
2. В разделе «Ключевые коэффициенты» есть 17 строк, содержащих данные (за исключением заголовков года). Что вы хотите?
3. @QHarr я хочу, чтобы все они имели год и их значения
4. Тогда вам нужен дополнительный идентификатор для строки, я думаю
5. @QHarr на этом конкретном веб-сайте есть несколько ссылок на источник данных. Можем ли мы получить данные непосредственно из ссылки и свести в таблицу? Можете ли вы предложить дополнительный идентификатор?
Ответ №1:
1) Вот один из способов с selenium и pandas. Вы можете просмотреть окончательную структуру здесь. Содержимое загружается на JavaScript, поэтому я думаю, что, вероятно, вам понадобятся дополнительные библиотеки.
2) Был сделан вызов для этого:
это возвращает json, содержащий информацию для страницы. Вы можете попробовать использовать requests
с этим.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import copy
d = webdriver.Chrome()
d.get('https://financials.morningstar.com/ratios/r.html?t=AAPL')
tables = WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#tab-profitability table")))
results = []
for table in tables:
t = pd.read_html(table.get_attribute('outerHTML'))[0].dropna()
years = t.columns[1:]
for row in t.itertuples(index=True, name='Pandas'):
record = {row[1] : dict(zip(years, row[2:]))}
results.append(copy.deepcopy(record))
print(results)
d.quit()
В итоге будут перечислены все 17 строк. Здесь показаны первые две строки со строкой 2, расширенной, чтобы показать сопоставление лет со значениями.
Комментарии:
1. Я бы приветствовал комментарии по улучшению вышеизложенного (хотя я знаю, что мог бы также спросить об этом позже в code review).
2. Спасибо. Это отлично работает :). Если бы, однако, я должен был заменить веб-сайт списком входных веб-сайтов, скажем, списком, а затем свести его в таблицу, какие изменения необходимо внести?
3. что касается кода, я скачал selenium и определил путь . в остальном код идеален
4. Зависит от того, имеют ли эти веб-сайты одинаковую структуру. Так ли это?
5. Хороший, QHarr!!