BeautifulSoup 有何用途

如果我们需要通过脚本来抓取网络中的数据时,使用传统的字符解析等方法时是非常低效的,而BeautifulSoup则可以方便的通过接口来获取标签中所想要得到的数据。主要用在解析静态页面的数据,如果设计到动态产生的内容,则还需要结合其他库模块来一起配合使用,如selenium模块等。

安装方法

pip install beautifulsoup4

详情可以见中文文档的地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id5

使用方法

在抓取网页数据时,一般和 requests 库一起使用,如下:

import requests
from bs4 import BeautifulSoup url = 'http://tianqi.com/hangzhou/7'
HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'} req = requests.get(url, headers=HEADERS, timeout=5)
soup = BeautifulSoup(req.text, "html.parser")

假如在request的请求中出现以下连接问题并且你的网路处于代理模式时,则需要在get接口中将代理的IP和端口填写上

抛出异常:
Connection Aborted Error(10060 ' A connection attempt failed becvause the connected party did not properly respond after a period of time, or established a connection failed because connected host has failed to respond' 解决方法:
PROXY = {'http': 'http://xx.xxx.xx.xx:xxxx'} 替换为代理IP和端口
req = requests.get(url, headers=HEADERS, proxies=PROXY, timeout=5)
soup = BeautifulSoup(req.text, "html.parser") timeout 参数是自己可以设定的连接超时时间,单位:秒

下文的小程序是用于获取一个城市7天的天气情况

爬取的网页地址是:http://tianqi.com/hangzhou/7

其中的 hangzhou 可以替换为其他任何城市

import requests
from bs4 import BeautifulSoup
import sys
HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'} def get_soup_from_link(url):
req = requests.get(url, headers=HEADERS, timeout=5)
return BeautifulSoup(req.text, "html.parser") def get_weather_report_list(weather_info):
weather_report_list = [] for group in weather_info:
detail_info = {}
txt = group.find_all(class_='txt')
detail_info['date'] = group.find('dl').get_text()
detail_info['description'] = group.find(class_='temp').get_text()
detail_info['temperature'] = txt[0].get_text()
detail_info['wind'] = txt[1].get_text() weather_report_list.append(detail_info) return weather_report_list def print_day_weather(weather_list, city):
print('City: ' + city)
for weather in weather_list:
print(weather['date'] + '\t' + weather['description'] + '\t' + weather['temperature'] + '\t' + weather['wind']) def main():
print(sys.argv) city = 'hangzhou'
if len(sys.argv) == 1:
city = 'hangzhou'
elif len(sys.argv) == 2:
city = sys.argv[1].lower()
else:
print('Usage: python Weather.py city_name\n city_name: hangzhou, shanghai, ...')
return weather_url = 'http://tianqi.com/' + city + '/7'
soup = get_soup_from_link(weather_url)
weather_table_day7 = soup.find_all(class_='table_day7')
weather_report_list = get_weather_report_list(weather_table_day7)
print_day_weather(weather_report_list, city) if __name__ == '__main__':
main()

通过Chrome F12,我们可以看到我们需要解析的标签数据如下,他们都在 class="table_day7 tag" 或者 class="table_day7" 中

<dl class="table_day7 tbg">
<dl>01月26日</dl>
<dd class="week">今天</dd>
<dd class="air">
<b style="background-color:#79b800;" title="空气质量:优">优</b>
</dd>
<dd class="img">
<img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b15.png"/>
</dd>
<dd class="temp">雪</dd>
<dd class="txt">
-1℃ ~ <b>1</b>

</dd>
<dd class="txt">东北风 3级</dd>
</dl>
...
...
<dl class="table_day7 ">
<dl>02月01日</dl>
<dd class="week">星期四</dd>
<dd class="air">
<b style="background-color:#79b800;" title="空气质量:优">优</b>
</dd>
<dd class="img">
<img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b1.png"/>
</dd>
<dd class="temp">多云</dd>
<dd class="txt">
-3℃ ~ <b>6</b>

</dd>
<dd class="txt">东北风 1级</dd>
</dl>

因此,我们需要先找到这些标签块,通过find_all(class_='table_day7')方法,我们可以很快找到这些内容

weather_url = 'http://tianqi.com/' + city + '/7'
soup = get_soup_from_link(weather_url)
weather_table_day7 = soup.find_all(class_='table_day7') find_all 返回的是一个列表,里面包含的是所有找到的匹配项。
入参使用带下划线的class,是因为class是python中的关键字,所以用class_来进行代替 下面就是我们暂时得到的数据结果: [<dl class="table_day7 tbg">
<dl>01月26日</dl>
<dd class="week">今天</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b15.png"/></dd>
<dd class="temp">雪</dd>
<dd class="txt">-1℃ ~ <b>1</b>℃</dd>
<dd class="txt">东北风 3级</dd>
</dl>, <dl class="table_day7 tbg">
<dl>01月27日</dl>
<dd class="week">明天</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b15.png"/></dd>
<dd class="temp">雪</dd>
<dd class="txt">-2℃ ~ <b>0</b>℃</dd>
<dd class="txt">北风 2级</dd>
</dl>, <dl class="table_day7 tbg">
<dl>01月28日</dl>
<dd class="week">后天</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b15.png"/></dd>
<dd class="temp">雪</dd>
<dd class="txt">0℃ ~ <b>2</b>℃</dd>
<dd class="txt">北风 3级</dd>
</dl>, <dl class="table_day7 ">
<dl>01月29日</dl>
<dd class="week">星期一</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b1.png"/></dd>
<dd class="temp">多云</dd>
<dd class="txt">-2℃ ~ <b>3</b>℃</dd>
<dd class="txt">北风 3级</dd>
</dl>, <dl class="table_day7 ">
<dl>01月30日</dl>
<dd class="week">星期二</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b0.png"/></dd>
<dd class="temp">晴</dd>
<dd class="txt">-2℃ ~ <b>4</b>℃</dd>
<dd class="txt">东北风 2级</dd>
</dl>, <dl class="table_day7 ">
<dl>01月31日</dl>
<dd class="week">星期三</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b0.png"/></dd>
<dd class="temp">晴</dd>
<dd class="txt">-2℃ ~ <b>5</b>℃</dd>
<dd class="txt">北风 2级</dd>
</dl>, <dl class="table_day7 ">
<dl>02月01日</dl>
<dd class="week">星期四</dd>
<dd class="air"><b style="background-color:#79b800;" title="空气质量:优">优</b></dd>
<dd class="img"><img src="http://pic9.tianqijun.com/static/tianqi2018/ico2/b1.png"/></dd>
<dd class="temp">多云</dd>
<dd class="txt">-3℃ ~ <b>6</b>℃</dd>
<dd class="txt">东北风 1级</dd>
</dl>]

所有的数据现在已经全部拿到,现在就需要分解出各个小项中的内容,主要还是使用find方法来查找标签,而通过get_text()方法,我们就可以获取到具体的内容

def get_weather_report_list(weather_info):
weather_report_list = [] for group in weather_info:
detail_info = {}
txt = group.find_all(class_='txt')
# txt 中包含了温度范围及风向内容 detail_info['date'] = group.find('dl').get_text()
# dl 标签中对应的是日期 detail_info['description'] = group.find(class_='temp').get_text()
# temp 对应了天气状态 detail_info['temperature'] = txt[0].get_text()
detail_info['wind'] = txt[1].get_text() weather_report_list.append(detail_info) return weather_report_list

爬取的数据,我们只用了BeautifulSoup中 find()、find_all()及get_text() 这几个方法,就取得了我们想要的文本内容,非常的方便。

BeautifulSoup 库的使用记录的更多相关文章

  1. Python爬虫小白入门(三)BeautifulSoup库

    # 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...

  2. BeautifulSoup库children(),descendants()方法的使用

    BeautifulSoup库children(),descendants()方法的使用 示例网站:http://www.pythonscraping.com/pages/page3.html 网站内容 ...

  3. 网络爬虫BeautifulSoup库的使用

    使用BeautifulSoup库提取HTML页面信息 #!/usr/bin/python3 import requests from bs4 import BeautifulSoup url='htt ...

  4. BeautifulSoup库的使用

    1.简介 BeautifulSoup库也是一个HTML/XML的解析器,其使用起来很简单,但是其实解析网站用xpath和re已经足矣,这个库其实很少用到.因为其占用内存资源还是比xpath更高. '' ...

  5. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  6. python下载安装BeautifulSoup库

    python下载安装BeautifulSoup库 1.下载https://www.crummy.com/software/BeautifulSoup/bs4/download/4.5/ 2.解压到解压 ...

  7. 基于BeautifulSoup库的HTML内容的查找

    一.BeautifulSoup库提供了一个检索的参数: <>.find_all(name,attrs,recursive,string,**kwargs),它返回一个列表类型,存储查找的结 ...

  8. BeautifulSoup库

    '''灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便的实现网页信息的提取.''' BeautifulSoup库包含的一些解析库: 解析库 使用方法 优势 劣势 py ...

  9. python BeautifulSoup库的基本使用

    Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以 ...

随机推荐

  1. 15.5.3 【Task实现细节】状态机的结构

    状态机的整体结构非常简单.它总是使用显式接口实现,以实现.NET 4.5引入的 IAsync StateMachine 接口,并且只包含该接口声明的两个方法,即 MoveNext 和 SetState ...

  2. DataInputStream 数据类型数据输入输出流

    package IOliu; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileI ...

  3. SPU、SKU、ARPU是什么,我来记录一下我的理解

    在电商系统里经常会提到“商品”.“单品”.“SPU”.“SKU”这几个词,那么这几个词到底是什么意思呢? 既然不知道是什么,那么我们就查一下:SPU = Standard Product Unit ( ...

  4. Problem 25

    Problem 25 The Fibonacci sequence is defined by the recurrence relation: Fn = Fn−1 + Fn−2, where F1 ...

  5. jsonp 后台返回注意事项

    前端代码 <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script ...

  6. ACDream - Crayon

    题目: Description There are only one case in each input file, the first line is a integer N (N ≤ 1,000 ...

  7. HTML【2】表单提交与服务层的模拟(具体解释get与post提交方式的不同)

    在HTML[1]中已经说明了HTML编程的基本方式,最后说到了表单提交的方式有get和post方式.那么究竟什么是get/post 方式呢,两者有什么差别?如今我就详细的介绍一下. 首先回想一下表单的 ...

  8. HDU 3104 Combination Lock(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3104 Problem Description A combination lock consists ...

  9. 一见钟情Sublime

    打开 preferences -> Setting-User,加入下面代码 { "font_size": 14, "ignored_packages": ...

  10. STM32的IO配置点灯

    1.led.c的详细的代码: /*----------------------------------------------------------*/ #include "led.h&q ...