题目如下:
1.设计get-content函数,url为了获取数据网站地址,函数返回值是网页文本
首先,我们介绍requests库和BeautifulSoup库,然后我们用requests库中的get获取网站内容的函数,并将其转换为text格式。要把r.encoding=r.apparent_encoding这样,中文也可以识别。
代码如下:
url="http://www.weather.com.cn/weather/101190801.shtml"
import requests from bs4 import BeautifulSoup def get_content(x): try: r=requests.get(x) r.encoding=r.apparent_encoding return r.text except: return print("爬取有误")
2.设计get-data函数,返回徐州七天的日期.天气.最高温度和最高温度;
第二个问题是,我们首先需要知道网页中存储的源代码是什么形式,所以我们打开网页并按下它F12查看源代码
首先,我们获取日期,先经历标签树,先观察日期对应的标签,(观察源代码后发现)标签为h1,然后使用find函数发现 h1标签 对应的内容,发现前7位是日期内容,存储在类表中。
代码如下:
def get_data(y): #获取日期 soup=BeautifulSoup(y,'html.parser') data1=soup.find_all("h1") a=list() for i in range(0,7): a.append(data1[i].text)
天气条件与最高温度和最低温度相似:
观察天气情况,发现标签为p标签属性wea,这样我们就可以用了findall函数更准确地找到内容,然后将其存储在列表中
#获取天气条件 data2=soup.find_all("p","wea") b=list() for i in range(0,7): b.append(data2[i].text)
最高温度与最低温度与天气条件相似:
#获得最高温度和最低温度 data3=soup.find_all("p","tem") c=list() for i in range(0,7): c.append(data3[i].text)
最后,我们用个大列表进行汇总即可:
d=list() d.append(a) d.append(b) d.append(c) return d
完整代码:
def get_data(y): #获取日期 soup=BeautifulSoup(y,'html.parser') data1=soup.find_all("h1") a=list() for i in range(0,7): a.append(data1[i].text) #获取天气条件 data2=soup.find_all("p","wea") b=list() for i in range(0,7): b.append(data2[i].text) #获得最高温度和最低温度 data3=soup.find_all("p","tem") c=list() for i in range(0,7): c.append(data3[i].text) d=list() d.append(a) d.append(b) d.append(c) return d
3.设计write-data函数写入内容fname文件
首先,函数的第二个参数是文件路径。为了方便和美观,我们将在这里查看data单个输出函数获取的内容,然后写入文件
代码:
def write_data(x,y): a=list() for i in range(0,3): for j in range(0,7): a.append(x[i][j]) f1=open(y,'w') for i in a: f1.write(str(i) "\n") f1.close()
4.设计主函数,调用三个函数爬行徐州日期的天气温度,并写入8-2.txt文件
调用函数,引入文件路径和网页网站:
url="http://www.weather.com.cn/weather/101190801.shtml" a=get_content(url) b=get_data(a) c="e://python/files/8-2.txt" write_data(b,c)
5.完整代码
import requests from bs4 import BeautifulSoup def get_content(x): try: r=requests.get(x) r.encoding=r.apparent_encoding return r.text except: return print("爬取有误") def get_data(y): #获取日期 soup=BeautifulSoup(y,'html.parser') data1=soup.find_all("h1") a=list() for i in range(0,7): a.append(data1[i].text) #获取天气条件 data2=soup.find_all("p","wea") b=list() for i in range(0,7): b.append(data2[i].text) #获得最高温度和最低温度 data3=soup.find_all("p","tem") c=list() for i in range(0,7): c.append(data3[i].text) d=list() d.append(a) d.append(b) d.append(c) return d def write_data(x,y): a=list() for i in range(0,3): for j in range(0,7): a.append(x[i][j]) f1=open(y,'w') for i in a: f1.write(str(i) "\n") f1.close() url="http://www.weather.com.cn/weather/101190801.shtml" a=get_content(url) b=get_data(a) c="e://python/files/8-2.txt" write_data(b,c)