Как получить данные и свести их в таблицу из нескольких ссылок на одном веб-сайте HTML

#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) Был сделан вызов для этого:

https://financials.morningstar.com/finan/financials/getKeyStatPart.html?amp;callback=jsonp1555262165867amp;t=XNAS:AAPLamp;region=usaamp;culture=en-USamp;cur=amp;order=ascamp;_=1555262166853

это возвращает 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!!