python - Pandas read_html 值错误 : No tables found

标签 python html pandas parsing web-scraping

我试图从“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”。我将不胜感激任何建议。

最佳答案

这是使用 selenium 进行浏览器自动化的解决方案

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')

我们使用pandas来解析html
tab_dfs=pd.read_html(tab_html)

来自 docs :

"read_html returns a list of DataFrame objects, even if there is only a single table contained in the HTML content"



所以我们用我们唯一的表索引到该列表中,索引为零
df=tab_dfs[0]

关于python - Pandas read_html 值错误 : No tables found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398785/

相关文章:

python - 为所有缺失日期数据框复制前一天的行

python - Pandas:将季度数据转换为月度数据

python - 访问在 ubuntu 服务器上运行的 docker 上运行的 MySQL

python - 为什么 `source` 在 .bash_profile 中与 virtualenvwrapper 一起使用?

python - 我想向 pandas 数据框添加新索引

javascript - 在 ASP.NET MVC 应用程序中渲染 iframe 内的部分 View

javascript - 替换$.ajax?

python - 缩放追随者模型

python - Gunicorn 不重新加载 worker

php - 无法使用 codeigniter 的 upload() 函数上传图片