请问为什么我输入代码后运行结果跟书上的不一样呀?而且还出现了多余的结果——None
2023是说的今年的年份吗?书上是2019
数据来源:
历史天气网 https://lishi.tianqi.com/
网页简单解析如下:
选定月份后,URL地址栏的URL
会变化,比如2021年10月在URL地址栏里是 https://lishi.tianqi.com/beijing/202110.html
,在URL最后的202110
就是变化的规律所在。
确定的URL规律后,我们再看看怎么解析出数据,我这里直接采用的是xpath
方法哈,整体完整代码大家参考如下即可(修改地址即可,北京是beijing
,其他城市的大家打开网页自己看即可,很简单)。
完整代码:
import requests
from lxml import etree
import pandas as pd
def get_html(month):
headers = {
"Accept-Encoding": "Gzip",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
}
url = f'https://lishi.tianqi.com/beijing/{month}.html'
r = requests.get(url, headers=headers)
r_html = etree.HTML(r.text)
return r_html
# 月份参数列表
month_list = pd.period_range('201101','202110',freq='M').strftime('%Y%m')
df = pd.DataFrame(columns=['日期', '最高气温', '最低气温', '天气', '风向'])
for i ,month in enumerate(month_list):
r_html = get_html(month)
# 找到存放历史天气数据的div节点
div = r_html.xpath('.//div[@class="tian_three"]')[0]
# 每个日期的历史天气数据的li节点组成的列表
lis = div.xpath('.//li')
for li in lis:
item = {
'日期':li.xpath('./div[@class="th200"]/text()')[0],
'最高气温':li.xpath('./div[@class="th140"]/text()')[0],
'最低气温':li.xpath('./div[@class="th140"]/text()')[1],
'天气':li.xpath('./div[@class="th140"]/text()')[2],
'风向':li.xpath('./div[@class="th140"]/text()')[3]
}
df = df.append(item, ignore_index=True)
print(f'{i+1}/130月数据已采集')
df.to_excel(r'北京历史天气数据.xlsx',index=None)
最终,我们采集的数据结果预览如下:
这个问题可能原因有很多种,需要看具体代码来分析,但多余的结果值"None"很有可能是没有返回值或者是因为函数没有正确返回导致的。我们可以通过以下几个步骤来找出错误并解决:
仔细检查代码,查找哪个函数返回了错误的值或者没有返回。可以使用print函数打印每个变量来进行调试,找出它们的值以及哪个函数返回了 None。在控制台可以看到打印输出的信息。
判读代码是否包含一些难以察觉的语法问题,在Python中缩进和语句的格式非常重要,尤其是在使用循环语句的时候。确保你的代码合理缩进并且每一行不包含无关的空格和空行。
确认你的Python版本,如果你的代码是在Python 2.x上编写的,然后在Python 3.x上运行,会发生一些不同,例如print函数。因此确保你使用正确的版本。
如果上述步骤都没有解决你的问题,可以尝试重新编写代码,根据正确的书本数码来进行编写,确保代码的正确输入。
另外,获取当前年份的方法很简单,可以使用Python中的datetime模块中的datetime类。具体如下:
from datetime import datetime
now = datetime.now()
print("当前年份为:", now.year)
这将打印当前年份的值,例如2021。