BeautifulSoup介绍

BeautifulSoup

response=requests.get("https://www.baidu.com")  ##获得网页的回应
html=response.text                         ##获得网页的源代码
soup=BeautifulSoup(html,"html.parser")     ##将网页转化成BeautifSoup对象

BeautifulSoup 简介

BeautifulSoup 就是 Python 的一个 HTML 或 XML 的解析库,我们可以用它来方便地从网页中提取数据,使用它对获得的网页进行解析
安装

pip3 install beautifulsoup4

BeautifulSoup 在解析的时候是依赖于解析器的,它支持 Python 标准库中的 HTML 解析器和一些第三方的解析器比如 lxml

推荐使用lxml 这个解析器,有解析 HTML 和 XML 的功能,但是必须安装一个 C 语言库,它叫做 lxml,我们在这里依然使用 pip 安装即可:

pip3 install lxml

使用

soup = BeautifulSoup(“html”,”解析器”)

soup = BeautifulSoup(html, 'lxml')

编译后赋值给soup,我们可以通过调用 soup 的各个方法和属性对这串 HTML 代码解析了。

BeautifulSoup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种

  • Tag #整个标签
  • NavigableString #标签的内容
  • BeautifulSoup #整个html文档
  • Comment

Tag

Tag就是 HTML中的一个个标签,例如title 、p 等等 HTML 标签就是 Tag

我们可以利用soup.标签名获取这些标签的内容,但是它查找的是在所有内容中的第一个符合要求的标签

对于 Tag它有两个重要的属性,是 name 和 attrs

soup.p.name              ##p标签的名字
soup.p.string            ##p标签的内容
soup.p.attrs             ##p标签的属性,返回的是一个字典
soup.p['class']          ##p标签的class属性
soup.p.get('class')      ##p标签的class属性,和上面的等价
soup.p['class']="newClass"   ##修改p标签的class属性
del soup.p['class']      ##删除p标签的class属性

NavigableString

我们已经得到了标签的内容,要获取标签内部的文字用 .string即可

print(soup.p)
print(soup.p.string)         ##打印出p标签的内容
##<pclass="xie" name="p标签">你好,世界</p>
##你好,世界!

BeautifulSoup

BeautifulSoup对象表示的是一个文档的全部内容。大部分时候,可以把它当做一个Tag对象,是一个特殊的Tag,我们可以分别获取它的类型,名称,以及属性

Comment

Comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成麻烦。

如果标签中有注释,则是 comment 对象,没有注释则不是 comment对象。所以我们在使用前判断是不是属于 comment类型 。

遍历文档树

.contents 返回的是一个list列表,可以通过索引方式获取
.children 返回的是一个list生成器,我们需要遍历获取所有子孙节点

print(soup.body.contents) ##打印出body标签内的所有标签,返回的是一个列表,包含\n
print(soup.body.contents[0])  ##我们可以通过索引的方式获取
print(soup.body.children)     ##返回的是list生成器,需要遍历获取值
for child in soup.body.children:
    print(child)

所有子孙节点

.contents和.children属性仅包含tag的直接子节点,.descendants属性可以对所有tag的子孙节点进行递归循环,和children类似

for child in soup.body.descendants:   ##遍历所有子孙节点标签
      print( child )

如果一个标签里面没有标签了,那么.string就会返回标签里面的内容。如果标签里面还有其他的标签,则会返回 None

搜索标签

find ( name , attrs ,recursive , text , **kwargs)  #搜素当前页面符合过滤器条件的第一个标签
find_all( name , attrs ,recursive , text , **kwargs)  #搜素当前页面符合过滤器条件的所有标签

find()与find_all()方法唯一的区别是fin()方法返回结果是只包含第一个标签,而find_all()方法直接返回所有标签

name参数
查找所有名字为name的 tag,字符串对象会被自动忽略掉

  • 传字符串
    最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,find_all方法会查找所有与字符串完整匹配的内容
print(soup.find_all('a'))    ##查找所有的a标签,返回的是一个list列表
print(soup.find_all('a',class_='xie'))   ##查找class='xie'的a标签
传正则表达式
  • 传入正则表达式作为参数
    find_all方法会通过正则表达式的match()来匹配内容
for tag in soup.find_all(re.compile("^b")):  ##找出所有以b开头的标签
    print(tag.name)
  • 传列表
    如果传入列表参数,find_all将会与列表中任一元素匹配的内容返回。
print(soup.find_all(['a', 'table']))   ##找出所有的a标签和table标签
  • 传True
    True可以匹配任何值
for tag in soup.find_all(True):
    print(tag.name)
  • 传方法
    如果没有合适过滤器,那么还可以定义一个方法,方法只接收一个元素。如果这个方法返回true,表示当前元素匹配并且被找到,如果不是,则返回false
def has_class_but_no_id(tag):    ##定义一个方法,如果tag中包含class属性却不包含id属性,那么返回true
    return tag.has_attr('class') and not tag.has_attr('id')
print( soup.find_all(has_class_but_no_id(tag)) )

attrs的keyword参数

注意:如果一个指定的参数不是搜素内置的函数名,搜索时会把该参数当做指定名字tag的属性来搜素,如果包含一个名字为id的参数,find_all会搜素每个tag的id属性

print(soup.find_all( id='link' ))  ##打印出所有id=link的标签
print(soup.find_all(href=re.compile("elsie"),id='link'))  ##打印出href中含有elsie,并且id=link的标签
print(soup.find_all( class_='xie'))  ##class是python的关键字,所以加下划线  打印出class为xie的标签

text参数

通过text参数可以搜素文档中的字符串内容,与name参数的可选值一样,text参数接受字符串、列表、正则表达式和True

print(soup.find_all(text="name"))    ##打印出网页中的name,返回一个列表,没有则返回空
print(soup.find_all(text=re.compile("name")))  ##打印出网页中含有name的词,返回一个列表

limit参数

find_all()方法返回全部的搜素结构,如果文档树很大那么搜素会很慢,如果我们不需要全部结果,可以使用limit参数限制返回结果的数量

print(soup.find_all('a',limit=3))   ##找出3个a标签

recursive参数

调用tag的find_all()方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False

print(soup.find_all('head',recursive=False))

CSS选择器

我们在写CSS时,标签名不加任何修饰,类名前加点,id名前加#,在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select() , 返回类型是list
通过标签名查找

print(soup.select('title'))   ##打印出标签是title的

通过类名查找

print(soup.select('.b'))      ##打印出类名是b的

通过id名查找

print(soup.select('#sister'))  ##打印出id名是sister的

组合查找

print(soup.select('p #link .xie'))  ##打印出p标签中,id=link,class=xie的

属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则匹配不到

print(soup.select("a[class='sister']"))  ##打印出a标签中class属性是sister的

以上的select方法返回的结果都是列表形式,可以遍历形式输出,然后用get_text()方法来获取他的内容

for i in soup.select('a'):
    print(i.get_text())   ##打印出a标签中的文本
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值