Python爬虫之Beautiful Soup解析库的使用

Beautiful Soup-介绍

Python第三方库,用于从HTML或XML中提取数据
官方:http://www.crummv.com/software/BeautifulSoup/

安装:pip install beautifulsoup4

Beautiful Soup-语法

soup = BeautifulSoup(html_doc,'html.parser‘,from_encoding='utf-8' )

第一个参数:html文档字符串

第二个参数:html解析器

第三个参数:html文档的编码

Beautiful Soup-使用

标签选择器操作

注意:只会返回一个指定的标签,这也是标签选择器的特性

选择元素

from bs4 import BeautifulSoup
html_doc='''
<div class="container"> <a href="/pc/home?sign=360_79aabe15" class="logo"></a> <nav id="nnav" data-mod="nnav"> <div class="nnav-wrap"> <ul class="nnav-items" id="nnav_main"> <li data-index="0"><a class="nnav-item" href="/pc/home?ch=youlike&sign=360_79aabe15" target="_blank" data-ch="youlike">推荐<span></span></a></li><li data-index="1"><a class="nnav-item" href="/pc/home?ch=good_safe2toera&sign=360_79aabe15" target="_blank" data-ch="good_safe2toera">新时代<span></span></a></li><li data-index="2"><a class="nnav-item" href="/pc/home?ch=fun&sign=360_79aabe15" target="_blank" data-ch="fun">娱乐<span></span></a></li><li data-index="3"><a class="nnav-item" href="/pc/home?
data-index="4"><a class="nnav-item" href="/pc/home?ch=economy&sign=360_79aabe15" target="_blank" data-ch="economy">财经<span></span></a></li>
'''
soup = BeautifulSoup(html_doc,'lxml')
#将html代码自动补全,并按html代码格式返回
print(soup.prettify())
#输出第一个a标签
print(soup.a)
#输出第一个span标签
print(soup.span)

  

运行结果如下:

<html>
<body>
<div class="container">
<a class="logo" href="/pc/home?sign=360_79aabe15">
</a>
<nav data-mod="nnav" id="nnav">
<div class="nnav-wrap">
<ul class="nnav-items" id="nnav_main">
<li data-index="0">
<a class="nnav-item" data-ch="youlike" href="/pc/home?ch=youlike&sign=360_79aabe15" target="_blank">
推荐
<span>
</span>
</a>
</li>
<li data-index="1">
<a class="nnav-item" data-ch="good_safe2toera" href="/pc/home?ch=good_safe2toera&sign=360_79aabe15" target="_blank">
新时代
<span>
</span>
</a>
</li>
<li data-index="2">
<a class="nnav-item" data-ch="fun" href="/pc/home?ch=fun&sign=360_79aabe15" target="_blank">
娱乐
<span>
</span>
</a>
</li>
<li data-index="3">
<a class="nnav-item" href="/pc/home?
data-index=">
</a>
<a class="nnav-item" data-ch="economy" href="/pc/home?ch=economy&sign=360_79aabe15" target="_blank">
财经
<span>
</span>
</a>
</li>
</ul>
</div>
</nav>
</div>
</body>
</html>
<a class="logo" href="/pc/home?sign=360_79aabe15"></a>
<span></span>

  

获取名称

获取属性

获取内容

from bs4 import BeautifulSoup
html_doc='''
<div class="container"> <a href="/pc/home?sign=360_79aabe15" class="logo"></a> <nav id="nnav" data-mod="nnav"> <div class="nnav-wrap"> <ul class="nnav-items" id="nnav_main"> <li data-index="0"><a class="nnav-item" href="/pc/home?ch=youlike&sign=360_79aabe15" target="_blank" data-ch="youlike">推荐<span></span></a></li><li data-index="1"><a class="nnav-item" href="/pc/home?ch=good_safe2toera&sign=360_79aabe15" target="_blank" data-ch="good_safe2toera">新时代<span></span></a></li><li data-index="2"><a class="nnav-item" href="/pc/home?ch=fun&sign=360_79aabe15" target="_blank" data-ch="fun">娱乐<span></span></a></li><li data-index="3"><a class="nnav-item" href="/pc/home?
data-index="4"><a class="nnav-item" href="/pc/home?ch=economy&sign=360_79aabe15" target="_blank" data-ch="economy">财经<span></span></a></li>
'''
soup = BeautifulSoup(html_doc,'lxml')
#输出第一个a标签的name
print(soup.a.name)
#输出第一个a标签的的class属性值,下面两种方法都可以
print(soup.a.attrs['class'])
print(soup.a['class'])
#输出第一个a标签的内容
print(soup.a.string)

  

运行结果如下:

a
['logo']
['logo']
None

  

嵌套选择

from bs4 import BeautifulSoup
html_doc='''
<a class="nnav-item" href="/pc/home?ch=youlike&sign=360_79aabe15" target="_blank" data-ch="youlike"><span>推荐</span></a>
'''
soup = BeautifulSoup(html_doc,'lxml')
print(soup.a.span.string)

  

运行结果如下:

推荐

  

子节点和子孙节点操作

获取所有的子节点

from bs4 import BeautifulSoup
html='''
<div class="bc">
<span class="fl" style="padding-top: 1px;"><a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105" height="48" alt="新东方在线网络课堂"></a></span>
<span class="fl" style="padding-top: 6px;">
<a href="http://cet4.koolearn.com/" target="_blank" rel="nofollow" class="ky">四级</a>
<a title="新东方在线网络课堂" href="http://www.koolearn.com/" target="_self">新东方在线</a> >
<a title="四级网络课堂" href="http://cet4.koolearn.com/" target="_self">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文
</span>
<a href="http://www.xdf.cn/" target="_blank" rel="nofollow" class="fr logo_p2"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208" height="24"></a>
</div>
''' soup = BeautifulSoup(html,'lxml')
#第一种方法
print(soup.div.contents)
#第二种方法
print(soup.div.children)
for i,child in enumerate(soup.div.children):
print(i,child)

运行结果如下:

['\n', <span class="fl" style="padding-top: 1px;"><a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/></a></span>, '\n', <span class="fl" style="padding-top: 6px;">
<a class="ky" href="http://cet4.koolearn.com/" rel="nofollow" target="_blank">四级</a>
<a href="http://www.koolearn.com/" target="_self" title="新东方在线网络课堂">新东方在线</a> >
<a href="http://cet4.koolearn.com/" target="_self" title="四级网络课堂">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文
</span>, '\n', <a class="fr logo_p2" href="http://www.xdf.cn/" rel="nofollow" target="_blank"><img height="24" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208"/></a>, '\n']
<list_iterator object at 0x0000000002E498D0>
0 1 <span class="fl" style="padding-top: 1px;"><a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/></a></span>
2 3 <span class="fl" style="padding-top: 6px;">
<a class="ky" href="http://cet4.koolearn.com/" rel="nofollow" target="_blank">四级</a>
<a href="http://www.koolearn.com/" target="_self" title="新东方在线网络课堂">新东方在线</a> >
<a href="http://cet4.koolearn.com/" target="_self" title="四级网络课堂">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文
</span>
4 5 <a class="fr logo_p2" href="http://www.xdf.cn/" rel="nofollow" target="_blank"><img height="24" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208"/></a>
6

  

获取所有的子孙节点

from bs4 import BeautifulSoup
html='''
<div class="bc">
<span class="fl" style="padding-top: 1px;">
<a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105" height="48" alt="新东方在线网络课堂"></a></span>
<span class="fl" style="padding-top: 6px;">
<a href="http://cet4.koolearn.com/" target="_blank" rel="nofollow" class="ky">四级</a>
<a title="新东方在线网络课堂" href="http://www.koolearn.com/" target="_self">新东方在线</a> >
<a title="四级网络课堂" href="http://cet4.koolearn.com/" target="_self">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文</span>
<a href="http://www.xdf.cn/" target="_blank" rel="nofollow" class="fr logo_p2"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208" height="24"></a> </div>
'''
soup = BeautifulSoup(html,'lxml')
print(soup.div.descendants)
for i,child in enumerate(soup.div.descendants):
print(i,child)

 

运行结果如下:

<generator object descendants at 0x00000000028F5AF0>
0 1 <span class="fl" style="padding-top: 1px;">
<a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/></a></span>
2 3 <a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/></a>
4 <img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/>
5 6 <span class="fl" style="padding-top: 6px;">
<a class="ky" href="http://cet4.koolearn.com/" rel="nofollow" target="_blank">四级</a>
<a href="http://www.koolearn.com/" target="_self" title="新东方在线网络课堂">新东方在线</a> >
<a href="http://cet4.koolearn.com/" target="_self" title="四级网络课堂">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文</span>
7 8 <a class="ky" href="http://cet4.koolearn.com/" rel="nofollow" target="_blank">四级</a>
9 四级
10 11 <a href="http://www.koolearn.com/" target="_self" title="新东方在线网络课堂">新东方在线</a>
12 新东方在线
13 > 14 <a href="http://cet4.koolearn.com/" target="_self" title="四级网络课堂">四级</a>
15 四级
16 > 17 <a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a>
18 英语四级词汇
19 > 正文
20 21 <a class="fr logo_p2" href="http://www.xdf.cn/" rel="nofollow" target="_blank"><img height="24" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208"/></a>
22 <img height="24" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208"/>
23

  

父节点和祖先节点操作

获取父节点和祖先节点

from bs4 import BeautifulSoup
html='''
<div class="bc">
<span class="fl" style="padding-top: 1px;">
<a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105" height="48" alt="新东方在线网络课堂"></a></span>
<span class="fl" style="padding-top: 6px;">
<a href="http://cet4.koolearn.com/" target="_blank" rel="nofollow" class="ky">四级</a>
<a title="新东方在线网络课堂" href="http://www.koolearn.com/" target="_self">新东方在线</a> >
<a title="四级网络课堂" href="http://cet4.koolearn.com/" target="_self">四级</a> >
<a href="http://cet4.koolearn.com/cihui/" title="英语四级词汇">英语四级词汇</a> > 正文</span>
<a href="http://www.xdf.cn/" target="_blank" rel="nofollow" class="fr logo_p2"><img src="http://images.koolearn.com/fe_upload/2015_9_2_1441179317774.jpg" width="208" height="24"></a> </div>
'''
soup = BeautifulSoup(html,'lxml')
print(soup.a.parent) #获取父节点
print(soup.a.parents) #获取祖先节点

运行结果如下:  

<span class="fl" style="padding-top: 1px;">
<a href="http://www.koolearn.com/" target="_blank" title="新东方在线网络课堂"><img alt="新东方在线网络课堂" height="48" src="http://images.koolearn.com/fe_upload/2015_9_2_1441179226504.jpg" width="105"/></a></span>
<generator object parents at 0x00000000028C5B48>

  

兄弟节点操作

获取兄弟节点

from bs4 import BeautifulSoup
html='''
<div class="more_box" id="moreBox">
 <h3>360识图</h3>
<a href="javascript:;" id="btnLoadMore" class="btn_loadmore">加载更多</a>
<p id="imgTotal" class="img_total">找到相关图片约 2637 张</p>
</div>
'''
soup = BeautifulSoup(html,'lxml')
print(soup.a.next_siblings) #获取前面的兄弟节点
print(soup.a.previous_siblings) #获取后面的兄弟节点

  

运行结果如下:

<generator object next_siblings at 0x0000000002885B48>
<generator object previous_siblings at 0x0000000002885B48>

  

python生成器generator

l = [x * x for x in range(10)]
g = (x * x for x in range(10))
print(l)
print(g)

运行结果如下:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x000000000251C468>

L 是一个list, 而 G 是一个generator:它们在创建时候最基本的不同就list是 [ ] ,而generator是 ( )

如果要一个个打印出来,可以通过next()函数来获得generator的下一个返回值

g = (x * x for x in range(10))
for i in range(10):
print(next(g))

  

运行结果如下

0
1
4
9
16
25
36
49
64
81

  

标准选择器操作


#可根据标签名、属性、内容查找文档,返回所有匹配结果
find_all(name,attrs,recusive,text,**kwargs)

#查找所有标签为a的节点
soup.find_all('a') #查找所有标签为a,链接符合/view/123/htm形式的节点
soup.find_all('a',href='/view/123.htm')
soup.find_all('a',href=re.compile(r'/view/\d+\.htm')) #查找所有标签为div,class为abc,文字为python的节点
soup.find_all('div',class_='abc',string='python') 属性:
#获取查到的节点的标签名称
node.name #获取查找到的a节点的href属性
node['href'] #获取查找到的a节点的链接文字
node.get_text() find(name,attrs,recusive,text,**kwargs)
可根据标签名、属性、内容查找文档,和find_all使用方法差不多,只不过返回第一个符合匹配的结果 find_parents() find_parent()
find_parents()返回所有祖先节点 ,find_parent()返回直接父节点 find_next_siblings() find_next_sibling()
find_next_siblings()返回前面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点 find_previous_siblings() find_previous_sibling()
find_previous_siblings()返回前面所有兄弟节点 , find_previous_sibling()返回前面第一个兄弟节点 find_all_next() find_next()
find_all_next()返回节点后所有符合条件的节点 , find_next()返回第一个符合条件的节点 find_all_previous() find_previous()
find_all_previous()返回节点后所有符合条件的节点 ,find_previous()返回第一个符合条件的节点

  

测试实例:

import bs4
html_doc='''
<div class="container"> <a href="/pc/home?sign=360_79aabe15" class="logo"></a> <nav id="nnav" data-mod="nnav"> <div class="nnav-wrap"> <ul class="nnav-items" id="nnav_main"> <li data-index="0"><a class="nnav-item" href="/pc/home?ch=youlike&sign=360_79aabe15" target="_blank" data-ch="youlike">推荐<span></span></a></li><li data-index="1"><a class="nnav-item" href="/pc/home?ch=good_safe2toera&sign=360_79aabe15" target="_blank" data-ch="good_safe2toera">新时代<span></span></a></li><li data-index="2"><a class="nnav-item" href="/pc/home?ch=fun&sign=360_79aabe15" target="_blank" data-ch="fun">娱乐<span></span></a></li><li data-index="3"><a class="nnav-item" href="/pc/home?
data-index="4"><a class="nnav-item" href="/pc/home?ch=economy&sign=360_79aabe15" target="_blank" data-ch="economy">财经<span></span></a></li><li data-index="5"><a class="nnav-item" href="/pc/home?ch=estate&sign=360_79aabe15" target="_blank" data-ch="estate">房产<span></span></a></li><li data-index="6"><a class="nnav-item" href="/pc/home?ch=car&sign=360_79aabe15" target="_blank" data-ch="car">汽车<span></span></a></li><li data-index="7"><a class="nnav-item" href="/pc/home?ch=sport&sign=360_79aabe15" target="_blank" data-ch="sport">体育<span></span></a></li><li data-index="8"><a class="nnav-item" href="/pc/home?ch=domestic&sign=360_79aabe15" target="_blank" data-ch="domestic">国内
'''
#创建BeautifulSoup对象
soup = bs4.BeautifulSoup(html_doc,'html.parser') #获取所有的链接
links = soup.find_all('a')
for link in links:
print(link.name,link['href'],link.get_text()) #获取/pc/home?sign=360_79aabe15的链接
link_node = soup.find('a',href='/pc/home?sign=360_79aabe15')
print(link_node.name,link_node['href'],link_node.get_text())

  

运行结果如下:

a /pc/home?sign=360_79aabe15
a /pc/home?ch=youlike&sign=360_79aabe15 推荐
a /pc/home?ch=good_safe2toera&sign=360_79aabe15 新时代
a /pc/home?ch=fun&sign=360_79aabe15 娱乐
a /pc/home?
data-index= 财经
a /pc/home?ch=economy&sign=360_79aabe15 财经
a /pc/home?ch=estate&sign=360_79aabe15 房产
a /pc/home?ch=car&sign=360_79aabe15 汽车
a /pc/home?ch=sport&sign=360_79aabe15 体育
a /pc/home?ch=domestic&sign=360_79aabe15 国内 a /pc/home?sign=360_79aabe15

  

Python爬虫之Beautiful Soup解析库的使用(五)的更多相关文章

  1. python 爬虫利器 Beautiful Soup

    python 爬虫利器 Beautiful Soup Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文 ...

  2. python爬虫之Beautiful Soup基础知识+实例

    python爬虫之Beautiful Soup基础知识 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库.它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档 ...

  3. [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息

    [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫   版权声明: ...

  4. Beautiful Soup解析库的安装和使用

    Beautiful Soup是Python的一个HTML或XML的解析库,我们可以用它来方便地从网页中提取数据.它拥有强大的API和多样的解析方式.官方文档:https://www.crummy.co ...

  5. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  6. Python Beautiful Soup 解析库的使用

    Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Beautiful Soup是Python的一个HTML或XML的解析库. 1.解析器 解析 ...

  7. 爬虫(五)—— 解析库(二)beautiful soup解析库

    目录 解析库--beautiful soup 一.BeautifulSoup简介 二.安装模块 三.Beautiful Soup的基本使用 四.Beautiful Soup查找元素 1.查找文本.属性 ...

  8. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  9. python 爬虫5 Beautiful Soup的用法

    1.创建 Beautiful Soup 对象 from bs4 import BeautifulSoup html = """ <html><head& ...

随机推荐

  1. DjangoAdmin自定义过滤器

    class UserIDFilter(admin.SimpleListFilter): # 自定义用户查询过滤器 title = _('关联用户') parameter_name = 'user_id ...

  2. jenkins配置sonarqube

    jenkins配置sonarqube 下载插件SonarQube Scanner for Jenkins 在系统管理系统设置中选择 SonarQube servers 配置服务器名称.访问URL地址, ...

  3. python yield from

    def kk(): print (1) yield print (2) return 3 k=kk() def hello(k): print("Hello world!") r ...

  4. 【转】ReactNative&weex&DeviceOne对比

    React Native出来有一段时间了,国内的weex和deviceone是近期发布的,我可以说从2011年就开始关注快速开发的跨平台平台技术了,接触过phoneGap.数字天堂.appcan等早期 ...

  5. linux笔记_day04

    1.cat 连接并显示 -n 显示行号 -E END 显示行尾 2.tac 从后往前显示 3.ctrl +C 4.more 向后翻  到最后会退出 5.less 翻到最后不退出 常用 支持b k sp ...

  6. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  7. 【vim】跳转到上/下一个修改的位置

    当你编辑一个很大的文件时,经常要做的事是在某处进行修改,然后跳到另外一处.如果你想跳回之前修改的地方,使用命令: Ctrl+o 来回到之前修改的地方 类似的: Ctrl+i 会回退上面的跳动.

  8. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  9. html5 postMessage解决跨域、跨窗口消息传递(转)

    仅做学习使用,原文链接:http://www.cnblogs.com/dolphinX/p/3464056.html 一些麻烦事儿 平时做web开发的时候关于消息传递,除了客户端与服务器传值还有几个经 ...

  10. zabbix系列(四)Zabbix3.0.4添加对Nginx服务的监控

    Zabbix3.0.4添加对Nginx服务的监控 通过Nginx的http_stub_status_module模块提供的状态信息来监控,所以在Agent端需要配置Nginx状态获取的脚本,和添加ke ...