解析库之Beautiful Soup(二)

原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
本次代码的环境:
运行平台: Windows
Python版本: Python3.x
IDE: PyCharm

一 概述

在文章解析库之Beautiful Soup(一)中已经详细介绍了Beautiful Soup库的相关内容,包括解析器、Beautiful Soup的基本用法,重点介绍了节点选择器:选择元素、提取信息、关联选择等内容。这篇博客接着上一篇的继续写,主要介绍Beautiful Soup的方法选择器:find_all()、find()两个主要内容,话不多说,直奔主题。
 

 
在这里插入图片描述

二 方法选择器

2.1 find_all()

直接给出find_all()方法的API:

  • find_all(name,attrs,recursive,text,**kwargs)
    这个方法的功能就是找到全部符合条件的内容。

(1)name
需要注意的是:这个name就是指的是节点的本身,如

节点的name就是name = ‘p’

html='''
<div class=" panel">
<div class="panel -heading" 
    <h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element" >Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class=" element" >Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml' )
print(soup.find_all(name= 'ul' ))
print(type(soup.find_all(name= 'ul')[0]))

结果:

[<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>, <ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>]
<class 'bs4.element.Tag'>

这段代码要找到的就是所有的ul节点,通过观察发现name为ul的节点有两个,并且返回的是列表类型,长度为2,每个元素类型都是bs4.element.Tag类型,也就是说依然可以使用嵌套方式将ul节点里面的li节点全部读取出来:

......
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml' )
for ul in soup.find_all(name = 'ul'):
    print(ul.find_all(name = 'li'))
    for li in ul.find_all(name = 'li'):
        print(li.string)

结果:

[<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
Foo
Bar
Jay
[<li class="element">Foo</li>, <li class="element">Bar</li>]
Foo
Bar

第二个for循环是获取每个li节点中的文本。
(2)attrs
name是根据标签名获取的内容,也可以通过attrs属性来相应的内容。

html='''
<div class=" panel">
<div class="panel -heading" 
    <h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name = "elements">
<li class="element">Foo</li>
<li class="element" >Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class=" element" >Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml' )
print(soup.find_all(attrs = {'id': 'list-1'}))
print(soup.find_all(attrs = {'name' : 'elements'}))

结果:

[<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>]
[<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>]

上面的代码是通过字典类型的方式,设置查询条件,得到的结果是列表类型。对于一些常用的属性,比如id和class等,我们可以不用attrs来传递。比如,要查询id为list-1的节点,可以直接传人id这个参数。还是上面的文本,我们换种方式来查询:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml' )
print(soup. find_ all(id='list-1'))
print(soup. find all(class_ =' element'))

这样也可以得到相应的结果,同时这样写更方便、更常见。但是需要注意的是,这里面的class属性,为了区别于Python中的class关键字,必须在后面增加一个_,以做区别。返回的结果依然会死Tag类型。
(3)text
text参数可以用来匹配节点的文本,传入形式可以是字符串,也可以是正则表达式。

html='''
<div class=" panel">
<div class="panel -heading" 
    <h4>Hello my name is Blessy</h4>
</div>
</div>
'''
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html, 'lxml' )
print(soup.find_all(text = re.compile('Hello')))

结果:

['Hello my name is Blessy\n']

这里面涉及到的正则表达式内容可以参考文章:Python小知识-正则表达式和Re库(一)Python小知识-正则表达式和Re库(二)这两篇文章。在这段代码中,find_all()方法传入text参数,该参数是正则表达式对像,结果返回的是列表类型。

2.2 find()

find()和find_all()的区别是:

  • find():返回结果是单个元素,也就是说返回匹配的第一个元素
  • find_all():返回的匹配的全部元素
    其他的功能和作用都是相同的。类似的还有:
     

     表 1
函数 功能
find_parents() 返回所有祖先节点
find_parent() 返回直接父节点
find_next_siblings() 返回后面所有的兄弟节点
find_next_sibling() 返回第一个兄弟节点
find_previous_siblings() 返回前面所有的兄弟节点
find_previous_sibling() 返回前面直接兄弟节点
find_all_next() 返回节点后所有符合条件的节点
find_next() 返回节点后第一个符合条件的节点
find_all_pevious() 返回节点前所有符合条件的节点
find_pevious() 返回节点前符合条件的直接节点

三 总结

这篇内容主要介绍了方法选择器find_all()和find()方法,这两个方法是在网络爬虫是经常会用到的。至此Beautiful Soup库的基本用法就介绍完了,以上内容参考资料:崔庆才《Python3 网络爬虫开发实战》(主要参考),夏敏捷《Python程序设计-从基础到开发》,[挪]芒努斯·利·海特兰德(Magnus Lie Hetland)《Python基础教程第3版 Python编程从入门到实践 》,并对以上作者表示感谢。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
 

 
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42555080/article/details/87877434