Я могу загрузить данные ежегодный из этого связь с помощью следующего кода, но это не то же самое, что показано на веб-сайте, потому что это данные за июнь:
Теперь у меня два вопроса:
Спасибо.
Откуда я знаю, что это javascript? Без понятия как это сделать...
Посмотрите несколько руководств по использованию селена и питона для очистки страниц.
Просто любопытно, а зачем сначала писать html в файл, а потом читать его с пандами? Панды могут принимать html-запрос напрямую:
import pandas as pd
symbol = 'AAPL'
url = 'https://finance.yahoo.com/quote/%s/financials?p=%s' %(symbol, symbol)
dfs = pd.read_html(url)
print(dfs[0])
Во-вторых, не уверен, почему у вас появляются ежегодные даты. Делая так, как у меня выше, показывает сентябрь.
print(dfs[0])
0 ... 4
0 Revenue ... 9/26/2015
1 Total Revenue ... 233715000
2 Cost of Revenue ... 140089000
3 Gross Profit ... 93626000
4 Operating Expenses ... Operating Expenses
5 Research Development ... 8067000
6 Selling General and Administrative ... 14329000
7 Non Recurring ... -
8 Others ... -
9 Total Operating Expenses ... 162485000
10 Operating Income or Loss ... 71230000
11 Income from Continuing Operations ... Income from Continuing Operations
12 Total Other Income/Expenses Net ... 1285000
13 Earnings Before Interest and Taxes ... 71230000
14 Interest Expense ... -733000
15 Income Before Tax ... 72515000
16 Income Tax Expense ... 19121000
17 Minority Interest ... -
18 Net Income From Continuing Ops ... 53394000
19 Non-recurring Events ... Non-recurring Events
20 Discontinued Operations ... -
21 Extraordinary Items ... -
22 Effect Of Accounting Changes ... -
23 Other Items ... -
24 Net Income ... Net Income
25 Net Income ... 53394000
26 Preferred Stock And Other Adjustments ... -
27 Net Income Applicable To Common Shares ... 53394000
[28 rows x 5 columns]
Для второй части вы можете попытаться найти данные 1 из нескольких способов:
1) Проверьте запросы XHR и получите нужные данные, включив параметры в URL-адрес запроса, который генерирует эти данные и может возвращать вам в формате json (который, когда я искал, я не мог сразу найти, поэтому перешел к к следующему варианту)
2) Поиск по тегам <script>
, так как формат json иногда может быть внутри этих тегов (которые я не очень тщательно искал, и думаю, что Selenium будет просто прямым способом, поскольку панды могут читать в таблицах)
3) Используйте селен, чтобы имитировать открытие браузера, получение таблицы и нажатие «Ежеквартально», а затем получение этой таблицы.
Я пошел с вариантом 3:
from selenium import webdriver
import pandas as pd
symbol = 'AAPL'
url = 'https://finance.yahoo.com/quote/%s/financials?p=%s' %(symbol, symbol)
driver = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe')
driver.get(url)
# Get Table shown in browser
dfs_annual = pd.read_html(driver.page_source)
print(dfs_annual[0])
# Click "Quarterly"
driver.find_element_by_xpath("//span[text()='Quarterly']").click()
# Get Table shown in browser
dfs_quarter = pd.read_html(driver.page_source)
print(dfs_quarter[0])
driver.close()
Используем ли мы find_element_by_xpath и //span[text() = 'любой' текст, который мы видим на веб-странице в других случаях?
да, если он находится в теге <span>
. По сути, он говорит найти указанный тег с указанным текстом. Просто будьте осторожны, чтобы там не было нескольких таких элементов. Если это так, вам может потребоваться добавить что-то еще, например (найти ПЕРВЫЙ элемент, который соответствует критериям)
Пробовали ли вы искать вопросы/ответы, связанные со скрейпингом страниц, сгенерированных Javascript?