使用Python处理网络文件

最近在学习网络课程,听课总结如下:

Python抓取网页并从中获取数据的步骤:

1.通过网络下载网页,使用requests库

2.解析网页格式,获取其中的数据,可以使用beautifulsoup4库

安装办法:

pip install requests

安装后使用次库的get()方法下载网页,requests.get(),参数是URL字符串。

示例:

import requests
res=requests.get("http://www.nmc.cn/publish/forecast/ABJ/beijing.html")#下载网页
res.raise_for_status
file=open("C:\\Users\\GYF\\Desktop\\doc\\weather.txt",'wb')
for line in res.iter_content():#以字节形式获取网页内容,并写入文件
    file.write(line)
file.close()

注意:为什么第四行要用b呢?是因为网页文件是二进制的文件。

接下来读取标签内容,以读取head标签内容为例

import requests
res=requests.get("http://www.nmc.cn/publish/forecast/ABJ/beijing.html")
res.raise_for_status
file=open("C:\\Users\\GYF\\Desktop\\doc\\weather.txt",'wb')
for line in res.iter_content():
    file.write(line)
file.close()

from bs4 import BeautifulSoup
res=open("C:\\Users\\GYF\\Desktop\\doc\\weather.txt",'r',encoding="utf-8").read()#res是网页内容字符串
soup=BeautifulSoup(res,features="html.parser")#soup是BeautifulSoup对象
str=soup.find('head')
print(str)

(为了学习时随时调整代码,主要是懒得重新建源文件,我这里没有遵循PEP8规范)倒数第二行使用find方法来抓取指定标签

运行结果:

<head>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0" name="viewport"/>
<title>北京-天气预报</title>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="北京天气预报,beijingtianqi,北京今日天气,北京周末天气,北京一周天气预报" name="keywords"/>
<meta content="北京天气预报,中央气象台官方网站权威发布台风、暴雨、寒潮、高温、沙尘暴、大雾等各类灾害性天气的预报警报。提供天气预报、天气实况、降水量预报、强对流天气预报、农业气象、海洋气象、环境气象、地质灾害气象、交通气象、水文气象、数 
值预报及预报员交流论坛等栏目。beijingtianqi,北京今日天气,北京周末天气,北京一周天气预报" name="description"/>
<link href="http://image.nmc.cn/static2/favicon.ico" rel="shortcut icon"/>
<link href="http://image.nmc.cn/static2/site/nmc/themes/basic/css/basic.css?v=20200110_20180517" rel="stylesheet" type="text/css"/>
<script src="http://image.nmc.cn/static2/jquery/jquery-1.9.1.min.js?v=20200110" type="text/javascript"></script>
<script src="http://image.nmc.cn/static2/site/nmc/themes/basic/js/doT.min.js?v=20200110" type="text/javascript"></script>
<script type="text/javascript">
var ctx = '/f';
var ctxStatic = 'http://image.nmc.cn/static2';
</script>
<link href="http://image.nmc.cn/static2/site/nmc/themes/basic/css/product_list.css?v=20200110" rel="stylesheet" type="text/css"/>
<link href="http://image.nmc.cn/static2/site/nmc/themes/basic/css/forecast.css?v=20200110" rel="stylesheet" type="text/css"/>
<style type="text/css">
                body{background: url('http://image.nmc.cn/static2/site/nmc/themes/basic/images/forecast/forecast_bg.png') no-repeat fixed center top;}
        </style>
</head>

可以看到整个head标签都被读了出来。

我们知道一份html文件中会有很多一样的标签,使用find只会显示出发现的第一个标签(find会返回给我们结果字符串),如果需要拿到所有标签,需要使用find_all(),它将以列表的形式返回找到的所有结果。

我们知道<a herf="http:\\www.baidu.com">里a是标签名,href是标签a下的属性。How do we get the website address?

import requests
res=requests.get("http://www.nmc.cn/publish/forecast/ABJ/beijing.html")
res.raise_for_status
file=open("C:\\Users\\GYF\\Desktop\\doc\\weather.txt",'wb')
for line in res.iter_content():
    file.write(line)
file.close()

from bs4 import BeautifulSoup
res=open("C:\\Users\\GYF\\Desktop\\doc\\weather.txt",'r',encoding="utf-8").read()#res是网页内容字符串
soup=BeautifulSoup(res,features="html.parser")#soup是BeautifulSoup对象
resultlist=soup.find_all('a')
#print(str)
geturls=[]
for i in range(len(resultlist)):
    geturls.append(resultlist[i].attrs['href'])
print(geturls)

上面这个代码片段中,我们用resultlist存储了所以a标签的内容,然后,用空列表geturls来存储我们想要的网址,可以看到我们使用了resultlist[i].attrs[''href"]来达到我们的目的。

待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值