Я посмотрел. URL в вашем сообщении в значительной степени опирается на JavaScript, чтобы заполнить страницу ее элементами. Вот почему BeautifulSoup этого не видит. Шаблон HTML имеет двенадцать таблиц, каждая из которых выглядит примерно так:
<table class="table table-striped table-sm">
<tbody id="form-information-modal-carousel-page-1">
<!-- Below is populated dynamically VIA JS -->
<tr>
<td class="text-center">
<i class="fas fa-spinner fa-spin"></i>
</td>
</tr>
</tbody>
</table>
</div>
<div class="carousel-item table-responsive">
<table class="table table-striped table-bordered table-sm">
<tbody id="form-information-modal-carousel-page-2">
<!-- Below is populated dynamically VIA JS -->
...
Обратите внимание на комментарии <!-- Below is populated dynamically VIA JS -->
. В основном все интересные данные не заполняются в этом HTML. Я зарегистрировал свой сетевой трафик c, и страница отправляет два XHR-запроса. Один выглядел многообещающе, а именно MetaLinks.json
. Он огромен, но, к сожалению, табличных данных там нет (все еще довольно интересно, может быть полезно для других вещей). Другой ресурс XHR является действительным документом HTML, который содержит данные запечатанной таблицы. JSON было бы лучше, так как нам не пришлось бы использовать BeautifulSoup для его анализа, но что угодно. Кстати, это HTML - это то, что мы действительно хотим очистить. Мы не хотим очищать предоставленный вами URL-адрес (интерактивное встроенное средство просмотра XBRL) - он фактически использует этот ресурс HTML XHR для заполнения себя. Это HTML - это то же самое, что вы видите, когда нажимаете на меню гамбургера встроенного средства просмотра XBRL в левом верхнем углу и выбираете «Открыть как HTML». Если у вас возникли проблемы с его поиском, URL-адрес: https://www.sec.gov/Archives/edgar/data/1701605/000170160519000089/bkr-2019093010xq.htm
РЕДАКТИРОВАТЬ - Вот небольшой пример. Я просто извлекаю некоторые цифры из таблиц:
def main():
import requests
from bs4 import BeautifulSoup
url = "https://www.sec.gov/Archives/edgar/data/1701605/000170160519000089/bkr-2019093010xq.htm"
response = requests.get(url, headers={})
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
for table in soup.find_all("table"):
for row in table.find_all("tr"):
for data in row.find_all("ix:nonfraction"):
print(data.text, end=" ")
print()
print()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
Вывод:
3,339 3,142 9,886 9,421
2,543 2,523 7,604 7,191
5,882 5,665 17,490 16,612
2,901 2,819 8,647 8,371
1,880 1,873 5,705 5,491
679 608 2,083 1,944
71 66 183 374
54 17 128 113
5,585 5,383 16,746 16,293
297 282 744 319
14 6 124 51
59 55 174 164
224 233 446 206
— 85 — 139
107 110 269 86
117 38 177 19
60 25 97 83
57 13 80 64
...
Вывод на самом деле намного длиннее, чем я показал, но вы поняли идею , Кроме того, я не извлекаю все соответствующие числа из таблиц, так как я смотрю только на теги ix:nonfraction
, но есть и другие виды (например, десятичные числа). HTML ДЕЙСТВИТЕЛЬНО плотный - вам нужно выяснить, как получить все остальные поля из каждой строки, позаботиться о не ix:nonfraction
тегах, обработать пустые столбцы и т. Д. c.