[英]pandas read_html ValueError: No tables found
我正在嘗試從“ https://www.wunderground.com/personal-weather-station/dashboard?ID=KMAHADLE7#history/tdata/s20170201/e20170201/mcustom.html ”天氣地下頁面中抓取歷史天氣數據。 我有以下代碼:
import pandas as pd
page_link = 'https://www.wunderground.com/personal-weather-station/dashboard?ID=KMAHADLE7#history/tdata/s20170201/e20170201/mcustom.html'
df = pd.read_html(page_link)
print(df)
我有以下回應:
Traceback (most recent call last):
File "weather_station_scrapping.py", line 11, in <module>
result = pd.read_html(page_link)
File "/anaconda3/lib/python3.6/site-packages/pandas/io/html.py", line 987, in read_html
displayed_only=displayed_only)
File "/anaconda3/lib/python3.6/site-packages/pandas/io/html.py", line 815, in _parse raise_with_traceback(retained)
File "/anaconda3/lib/python3.6/site-packages/pandas/compat/__init__.py", line 403, in raise_with_traceback
raise exc.with_traceback(traceback)
ValueError: No tables found
雖然,此頁面顯然有一個表,但read_html並未選擇它。 我嘗試使用Selenium,以便在閱讀頁面之前可以加載該頁面。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("https://www.wunderground.com/personal-weather-station/dashboard?ID=KMAHADLE7#history/tdata/s20170201/e20170201/mcustom.html")
elem = driver.find_element_by_id("history_table")
head = elem.find_element_by_tag_name('thead')
body = elem.find_element_by_tag_name('tbody')
list_rows = []
for items in body.find_element_by_tag_name('tr'):
list_cells = []
for item in items.find_elements_by_tag_name('td'):
list_cells.append(item.text)
list_rows.append(list_cells)
driver.close()
現在,問題在於它找不到“ tr”。 我將不勝感激任何建議。
您可以使用requests
,避免打開瀏覽器。
您可以使用以下方法獲取當前狀況:
和'jQuery1720724027235122559_1542743885014('
從左到右')'
條帶。 然后處理json字符串。
您可以通過以下代碼調用API來獲取摘要和歷史記錄
然后,您需要從前面和');'
剝離'jQuery1720724027235122559_1542743885015('
');'
從右邊。 然后,您可以解析一個JSON字符串。
JSON樣本:
您可以通過使用瀏覽器中的F12開發工具並檢查“網絡”標簽中的頁面加載期間創建的流量來找到這些URL。
current
的示例,注意到JSON中的nulls
似乎存在問題,因此我將其替換為"placeholder"
:
import requests
import pandas as pd
import json
from pandas.io.json import json_normalize
from bs4 import BeautifulSoup
url = 'https://stationdata.wunderground.com/cgi-bin/stationlookup?station=KMAHADLE7&units=both&v=2.0&format=json&callback=jQuery1720724027235122559_1542743885014&_=15'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
s = soup.select('html')[0].text.strip('jQuery1720724027235122559_1542743885014(').strip(')')
s = s.replace('null','"placeholder"')
data= json.loads(s)
data = json_normalize(data)
df = pd.DataFrame(data)
print(df)
這是使用硒實現瀏覽器自動化的解決方案
from selenium import webdriver
import pandas as pd
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(30)
driver.get('https://www.wunderground.com/personal-weather-station/dashboard?ID=KMAHADLE7#history/tdata/s20170201/e20170201/mcustom.html')
df=pd.read_html(driver.find_element_by_id("history_table").get_attribute('outerHTML'))[0]
Time Temperature Dew Point Humidity Wind Speed Gust Pressure Precip. Rate. Precip. Accum. UV Solar
0 12:02 AM 25.5 °C 18.7 °C 75 % East 0 kph 0 kph 29.3 hPa 0 mm 0 mm 0 0 w/m²
1 12:07 AM 25.5 °C 19 °C 76 % East 0 kph 0 kph 29.31 hPa 0 mm 0 mm 0 0 w/m²
2 12:12 AM 25.5 °C 19 °C 76 % East 0 kph 0 kph 29.31 hPa 0 mm 0 mm 0 0 w/m²
3 12:17 AM 25.5 °C 18.7 °C 75 % East 0 kph 0 kph 29.3 hPa 0 mm 0 mm 0 0 w/m²
4 12:22 AM 25.5 °C 18.7 °C 75 % East 0 kph 0 kph 29.3 hPa 0 mm 0 mm 0 0 w/m²
由於上面的一類代碼實際上並不是很好的自記錄代碼,因此請按實際情況進行細化的編輯:
設置驅動程序后,我們選擇具有其ID值的表(感謝此站點實際上使用了合理的描述性ID)
tab=driver.find_element_by_id("history_table")
然后,從該元素中獲取HTML而不是Web驅動程序元素對象
tab_html=tab.get_attribute('outerHTML')
我們使用熊貓來解析html
tab_dfs=pd.read_html(tab_html)
從文檔 :
“即使HTML內容中僅包含一個表,read_html也會返回DataFrame對象的列表”
因此,我們使用唯一的表索引到該列表,索引為零
df=tab_dfs[0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.