Парсинг таблицы с веб-сайта с использованием python - PullRequest
1 голос
/ 17 июня 2020

Я попытался использовать запросы и BeautifulSoup для анализа Индекса человеческого развития (HDI) с этого веб-сайта http://hdr.undp.org/en/indicators/137506# Проверяя страницу, я получил это для таблицы

<div id="indcontent">
<table id="table"><thead><tr><th style="width:auto;">HDI Rank</th><th style="width:auto;">Country</th><th style="width:auto;">1990</th><th style="width:auto;"></th><th style="width:auto;">1991</th><th 
.
.
 style="width:auto;"></th><th style="width:auto;">2016</th><th style="width:auto;"></th><th style="width:auto;">2017</th><th style="width:auto;"></th><th style="width:auto;">2018</th><th style="width:auto;"></th></tr><tr><th class="indName">Human Development Index (HDI)
null
Dimension: Composite indices
Definition: A composite index measuring average achievement in three basic dimensions of human development—a long and healthy life, knowledge and a decent standard of living. See Technical note 1 at http://hdr.undp.org/sites/default/files/hdr2019_technical_notes.pdf for details on how the HDI is calculated.
Source: HDRO calculations based on data from UNDESA (2019b), UNESCO Institute for Statistics (2019), United Nations Statistics Division (2019b), World Bank (2019a), Barro and Lee (2018) and IMF (2019).</th></tr></thead><tbody><tr class="row-even"><td>170</td><td><img src="/sites/default/files/Country-Profiles/AFG.GIF" style="width:20px; height:auto;"> <a href="/countries/profiles/AFG">Afghanistan</a></td><td>0.298</td><td></td><td>0.304</td><td></td><td>0.312</td><td></td><td>0.308</td><td></td><td>0.303</td><td></td><td>0.327</td><td></td><td>0.331</td><td></td><td>0.335</td><td></td>
.
.
<td>0.339</td><td></td><td>0.343</td><td></td><td>0.345</td><td></td><td>0.347</td><td></td><td>0.378</td><td></td><td>0.387</td><td></td><td>0.400</td><td></td><td>0.410</td><td></td><td>0.419</td><td></td><td>0.431</td><td></td><td>0.436</td><td></td><td>0.447</td><td></td><td>0.464</td><td></td><td>0.465</td><td></td><td>0.479</td><td></td><td>0.485</td><td></td><td>0.708</td><td></td><td>0.713</td><td></td><td>0.718</td><td></td><td>0.722</td><td></td><td>0.727</td><td></td><td>0.729</td><td></td><td>0.731</td><td></td></tr><tr><td class="footnotestable"></td></tr></tbody><tfoot></tfoot></table></div>

Каждый раз, когда я запускаю свой код

from bs4 import BeautifulSoup
import requests

url="http://hdr.undp.org/en/indicators/137506#"

html_table = requests.get(url)

soup = BeautifulSoup(html_table.content, "html.parser")
# print(soup.prettify()) # print the parsed data of html to test it!

hdi_table = soup.find("div", attrs={"id": "indcontent"})
print(hdi_table)

, чтобы попытаться определить, есть ли внутри него содержимое, он возвращает

<div id="indcontent">
</div>
hdi_table = soup.find("table", attrs={"id": "table"})
rows = hdi_table.table.find_all("tr")

, чтобы вернуть что-либо внутри, но выводит NoneType после этот шаг я хотел включить

headers = rows[0]
header_text = []

for th in headers.find_all('th'):
    header_text.append(th.text)

row_text_array = []

for row in rows[1:]:
    row_text = []

    for row_element in row.find_all(['th', 'td']):
        row_text.append(row_element.text.replace('\n', '').strip())

    row_text_array.append(row_text)

with open("out.csv", "w") as f:
    wr = csv.writer(f)
    wr.writerow(header_text)

    for row_text_single in row_text_array:
        wr.writerow(row_text_single)

Был бы очень признателен за помощь! Попытка собрать код в единое целое, чтобы получить таблицу в формате csv. Я пробовал xpath //*[@id="indcontent"], но не смог приступить к работе.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Данные в таблице загружены с javascript, однако я обычно стараюсь избегать синтаксического анализа javascript при очистке данных и стараюсь придерживаться только запросов и beautifulsoup. Часто нужные данные загружаются с некоторого внутреннего api / адреса, к которому вы можете получить прямой доступ. В вашем случае он, кажется, исходит из нескольких источников:

http://hdr.undp.org/sites/all/themes/hdr_theme/js/bars.json
http://hdr.undp.org/sites/all/themes/hdr_theme/js/footnotes.json
http://hdr.undp.org/sites/all/themes/hdr_theme/js/rankiso.json
http://hdr.undp.org/sites/all/themes/hdr_theme/js/aggregates.json
http://hdr.undp.org/sites/all/themes/hdr_theme/js/summary.json

Вы можете вытащить их с запросами и загрузить их в свой python, используя json. Самый простой способ найти эти ссылки - открыть f12, go в сети, перезагрузить веб-страницу и посмотреть, какие файлы передаются, особенно для таких расширений, как json, csv, et c.

0 голосов
/ 17 июня 2020

Кажется, для загрузки данных на сайт индекса человеческого развития (HDI) требуется JavaScript. Чтобы разобрать это, вы можете использовать, например, Selenium. Подробнее о парсинге с использованием Selenium и BeautifulSoup в этом вопросе .

Если вам просто нужно загрузить его один раз, вы можете просто нажать кнопку «Загрузить данные» на странице и использовать кнопку « .csv "файл, который создает.

...