Извлечение таблицы с сайта с использованием Pandas - PullRequest
0 голосов
/ 12 апреля 2020

Привет, я хотел извлечь таблицу из URL = 'http://www.nativeplant.com/plants/search/input'. Я продолжил использовать Pandas в Python 3

import requests
import pandas as pd

url = 'http://www.nativeplant.com/plants/search/input'
df_list = pd.read_html(html)
df = df_list[0]
print(df)
df.to_csv('my data.csv')

, однако, когда я вызывая функцию read_ html, она выдает ошибку, говорящую: имя "html" не определено. При замене внутренней части функции на «url» я получаю сообщение об ошибке: «Таблицы не найдены»

Я не понимаю, в чем проблема.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

В вашем коде есть две проблемы:

  1. вы определили URL как переменную url, а в функции read_ html () вы указали ее как html, которая была не определено.

  2. Целевым URL является страница с фреймами, в фрейме нет таблиц. После проверки исходного кода таблица находится на этой странице: http://www.nativeplant.com/plants/search/default_list

Код ниже должен дать вам то, что вы хотите.

import requests
import pandas as pd

url = 'http://www.nativeplant.com/plants/search/default_list'
df_list = pd.read_html(url)
df = df_list[1]
df
0 голосов
/ 12 апреля 2020

Я не знаю, как это сделать pd.read_ html () ... Более того, когда я пытаюсь выполнить простой запрос get с вашим URL, элемент таблицы не возвращается. Я полагаю, именно поэтому простой pd.read_ html не работает.

Однако

Когда вы нажимаете кнопку «UpdateList», это вызывает запрос на получение данных. (F12 -> Сеть -> Html)

Необходимо указать элементы в параметрах dict. Каждый элемент соответствует dropDowns, флажкам в пространстве поиска. Go к инспектору браузера, чтобы установить соединение.

import requests as rq
import pandas as pd
from bs4 import BeautifulSoup as bs

params = {"check":"1","flower_color":"","Ssite":"","searchstr":"","bloom_time":"","Wsite":"","H_Oper":"gt","HTSEL":"","sel_region":"","SUBMIT":"Update List","sortkey":"Scientific_Name","C_Oper":"eq","C":"","Origin":"N","show_latin":"1","show_blooms":"1","W_Oper":"eq","W":"","show_common":"1","S_Oper":"eq","S":"","show_light":"1","show_moisture":"1","show_Thumbs":"1","Thumb_size":"50","show_height":"1","show_price":"1"}
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0)  Gecko/20100101 Firefox/76.0"}

url = 'http://www.nativeplant.com/plants/search/report?'

resp = rq.get(url, headers=headers, params=params)
soup = bs(resp.content)

## c = colnames ; d = data
c = [[th.text.strip() for th in tr.find_all("th")] for tr in soup.find_all("table")[0].find_all('tr')][0]
d = [[td.text.strip() for td in tr.find_all('td')] for tr in soup.find_all("table")[0].find_all('tr')][1:] # this is the second table of the page

df = pd.DataFrame(d, columns=c)
...