Веб-сканирование из таблицы Википедии? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь получить данные из этой статьи Википедии , содержащей таблицу каждого национального парка вместе с некоторыми деталями каждого парка. Изменив код из аналогичного учебника, который я нашел, я смог отобразить название и состояние каждого парка, поскольку территория парка не работает. Я подозреваю, что это потому, что имя и состояние являются ссылками в статье Википедии, хотя я не уверен. Как мне изменить свой код, чтобы также отображать эту область?

import requests
from bs4 import BeautifulSoup

URL = "https://en.wikipedia.org/wiki/List_of_national_parks_of_the_United_States"

res = requests.get(URL).text
soup = BeautifulSoup(res,'html.parser')
for items in soup.find('table', class_='wikitable').find_all('tr')[1::1]:
    data = items.find_all(['th','td'])
    try:
        parkName = data[0].a.text
        parkState = data[2].a.text
        parkArea = data[4].span.text

    except IndexError:pass
    print("{} | {} | {}".format(parkName, parkState, parkArea))

Фрагмент моего вывода

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Чтобы получить текст области, вы можете использовать .get_text(), а затем str.rsplit(), чтобы получить только площадь в акрах:

import requests
from bs4 import BeautifulSoup

url = "https://en.wikipedia.org/wiki/List_of_national_parks_of_the_United_States"
soup = BeautifulSoup(requests.get(url).content,'html.parser')

rows = iter(soup.select('.wikitable tr:has(td, th)'))
next(rows)  # skip headers

for tr in rows:
    name, _, state, _, area, *_ = tr.select('td, th')
    name = name.get_text(strip=True)
    state = state.a.get_text(strip=True)
    area = area.get_text(strip=True).rsplit(maxsplit=2)[0]
    print('{:<35}{:<25}{}'.format(name, state, area))

Печать:

Acadia                             Maine                    49,076.63 acres
American Samoa                     American Samoa           8,256.67 acres
Arches                             Utah                     76,678.98 acres
Badlands                           South Dakota             242,755.94 acres
Big Bend                           Texas                    801,163.21 acres
Biscayne                           Florida                  172,971.11 acres
Black Canyon of the Gunnison       Colorado                 30,779.83 acres
Bryce Canyon                       Utah                     35,835.08 acres
Canyonlands                        Utah                     337,597.83 acres
Capitol Reef                       Utah                     241,904.50 acres
Carlsbad Caverns*                  New Mexico               46,766.45 acres
Channel Islands                    California               249,561.00 acres
Congaree                           South Carolina           26,476.47 acres
Crater Lake                        Oregon                   183,224.05 acres
Cuyahoga Valley                    Ohio                     32,571.88 acres
Death Valley                       California               3,408,406.73 acres
Denali                             Alaska                   4,740,911.16 acres
Dry Tortugas                       Florida                  64,701.22 acres
Everglades                         Florida                  1,508,938.57 acres
Gates of the Arctic                Alaska                   7,523,897.45 acres
Gateway Arch                       Missouri                 192.83 acres
Glacier                            Montana                  1,013,125.99 acres
Glacier Bay                        Alaska                   3,223,383.43 acres
Grand Canyon*                      Arizona                  1,201,647.03 acres
Grand Teton                        Wyoming                  310,044.36 acres
Great Basin                        Nevada                   77,180.00 acres
Great Sand Dunes                   Colorado                 107,341.87 acres
Great Smoky Mountains              North Carolina           522,426.88 acres
Guadalupe Mountains                Texas                    86,367.10 acres
Haleakalā                          Hawaii                   33,264.62 acres
Hawaiʻi Volcanoes                  Hawaii                   325,605.28 acres
Hot Springs                        Arkansas                 5,554.15 acres
Indiana Dunes                      Indiana                  15,349.08 acres
Isle Royale                        Michigan                 571,790.30 acres
Joshua Tree                        California               795,155.85 acres
Katmai                             Alaska                   3,674,529.33 acres
Kenai Fjords                       Alaska                   669,650.05 acres
Kings Canyon                       California               461,901.20 acres
Kobuk Valley                       Alaska                   1,750,716.16 acres
Lake Clark                         Alaska                   2,619,816.49 acres
Lassen Volcanic                    California               106,589.02 acres
Mammoth Cave                       Kentucky                 54,011.91 acres
Mesa Verde*                        Colorado                 52,485.17 acres
Mount Rainier                      Washington               236,381.64 acres
North Cascades                     Washington               504,780.94 acres
Olympic                            Washington               922,649.41 acres
Petrified Forest                   Arizona                  221,390.21 acres
Pinnacles                          California               26,685.73 acres
Redwood*                           California               138,999.37 acres
Rocky Mountain                     Colorado                 265,807.25 acres
Saguaro                            Arizona                  91,715.72 acres
Sequoia                            California               404,062.63 acres
Shenandoah                         Virginia                 199,223.77 acres
Theodore Roosevelt                 North Dakota             70,446.89 acres
Virgin Islands                     U.S. Virgin Islands      15,052.53 acres
Voyageurs                          Minnesota                218,222.35 acres
White Sands                        New Mexico               146,344.31 acres
Wind Cave                          South Dakota             33,970.84 acres
Wrangell–St. Elias*                Alaska                   8,323,146.48 acres
Yellowstone                        Wyoming                  2,219,790.71 acres
Yosemite*                          California               761,747.50 acres
Zion                               Utah                     147,242.66 acres
0 голосов
/ 27 мая 2020

Вы можете изменить эту строку:

parkArea = data[4].span.text

на эту, если хотите площадь в акрах:

parkArea = data[4].text.split(' ')[0]

или это в км2:

parkArea = data[4].text.split(' ')[2] 
...