使用BeautifulSoup提取数据,返回NoneType

时间:2019-12-25 01:37:27

标签: python html web-scraping beautifulsoup

使用soup.find提取表数据时,变量表将返回NoneType。错误是:'NoneType'对象没有属性'find'。该网站的班级名称如下图所示,因此这与我使用的班级名称不一样。我不确定自己做错了什么,我们将不胜感激。

import requests
from bs4 import BeautifulSoup

url = "https://www.wunderground.com/history/monthly/KATL/date/2019-12"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
table = soup.find("table",{"class":"days ng-star-inserted"})
table_body = table.find('tbody')

Developer Tools Inspector

2 个答案:

答案 0 :(得分:3)

请求返回页面的源代码“原样”:除其他外,它不执行任何JavaScript。该页面中的表由脚本动态创建,该脚本对数据进行API调用,这意味着当BeautifulSoup解析HTML时,该表根本不存在。当我检查时,获得数据的确切请求是https://api.weather.com/v1/location/KATL:9:US/observations/historical.json?apiKey=6532d6454b8aa370768e63d6ba5a832e&units=e&startDate=20191201&endDate=20191231

有两种典型的解决方案:第一种,理想的解决方案是找到页面用于获取数据的API调用/请求,然后自己复制。第二个是通过编程控制浏览器(或复制其功能),人们经常使用Selenium。

幸运的是,该网站似乎提供了API。当然,如果您的目标只是学习网络抓取,那就不好了。

答案 1 :(得分:1)

可以从“网络”标签中找到的API调用中动态检索数据。可以从多个js源文件中的任意一个提取API密钥-要求附加请求。您需要转换为EST,然后使用groupby计算最大,最小,平均值。示例:

import requests
import pandas as pd
import numpy as np
from datetime import datetime
from pytz import timezone
import pytz
import re

def get_api_key():
    r = requests.get('https://www.wunderground.com/bundle-next/6-es2015.002cd6130a78daeda544.js')
    p = re.compile(r'sunApiKey:"(.*?)"')
    api_key = p.findall(r.text)[0]
    return api_key

def get_est_localtime(timestamp):
    utc_dt =  utc.localize(datetime.utcfromtimestamp(timestamp))
    est_dt = utc_dt.astimezone(est_tz)
    return est_dt

utc = pytz.utc
fmt = '%Y-%m-%d'
est_tz = timezone('US/Eastern')
api_key = get_api_key()
r = requests.get(f'https://api.weather.com/v1/location/KATL:9:US/observations/historical.json?apiKey={api_key}&units=e&startDate=20191201&endDate=20191231')
df = pd.DataFrame(r.json()['observations'])
df['valid_time_gmt'] = df['valid_time_gmt'].map(lambda x: get_est_localtime(x).strftime(fmt))
df = df.groupby(by='valid_time_gmt').agg([min, max, np.mean])
print(df['temp'])

参考文献:

  1. pytz
  2. agg通过@MightyCurious
  3. pandas agg