当前位置:   article > 正文

BeautifulSoup4使用总结_beautifulsoup4用法

beautifulsoup4用法

1.BeautifulSoup4简介

BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

2.Beautifulsoup4主要解析器

在这里插入图片描述

3.BeautifulSoup4简单使用

3.1创建beautifulsoup4对象

#导入库:
from bs4 import BeautifulSoup
#创建实例:
file = open("./bs4test.html","rb")    
#创建对象
html = file.read()
#使用Python标准库进行解析                          
bs = BeautifulSoup(html,"html.parser")  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.2 BeautifulSoup4四大对象使用

3.2.1 简介

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

  • tag
  • NavigableString
  • BeautifulSoup
  • Comment

3.2.2 tag
获得标签及其内容,默认拿到它所找的第一个标签的内容

#获取title标签的所有内容
print(bs.title)

#获取第一个a标签的所有内容
print(bs.a)

#获取head标签的所有内容
#print(bs.head)

#查看类型
print(type(bs.a))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

tag两个重要的属性,name和attrs

# [document] #bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.name) 

# head #对于其他内部标签,输出的值便为标签本身的名称
print(bs.head.name) 

# 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a.attrs) 

#还可以利用get方法,传入属性的名称,二者是等价的
print(bs.a['class']) # 等价 bs.a.get('class')

# 可以对这些属性和内容等等进行修改
bs.a['class'] = "newClass"
print(bs.a) 

# 还可以对这个属性进行删除
del bs.a['class'] 
print(bs.a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.2.3 NavigableString
获得标签里的内容(字符串),使用.string的方式就可以了

# #只要标签里面的内容
print(type(bs.title.string))
  • 1
  • 2

3.2.4 BeautifulSoup

获取整个文档内容
print(bs.name)
print(bs.attrs)
#获取整个文档内容
print(bs)
  • 1
  • 2
  • 3
  • 4
  • 5

3.2.5 Comment
是一个特殊的NavigableString,输出内容不包含注释符号

#这种方式不会出现注释符
print(bs.a.string)
#查看类型
print(type(bs.a.string))
  • 1
  • 2
  • 3
  • 4

4.遍历文档树

4.1 contents
获取Tag的所有子节点,返回一个list

#tag的.content 属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)  

#用列表索引来获取它的某一个元素        
print(bs.head.contents[1 ])   
  • 1
  • 2
  • 3
  • 4
  • 5

4.2 children
获取Tag的所有子节点,返回一个生成器

for child in  bs.body.children:
    print(child)
  • 1
  • 2

其他:
descendants:获取Tag的所有子孙节点
5.4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
5.5、.stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容
5.6、.parent:获取Tag的父节点
5.7、.parents:递归得到父辈元素的所有节点,返回一个生成器
5.8、.previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
5.9、.next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
5.10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器
5.11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器
5.12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的
5.13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的
5.14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容
5.15、.next_elements:返回一个生成器,可以向后访问文档的解析内容
5.16、.has_attr:判断Tag是否包含属性

5. 搜索文档树

5.1 find_all()
字符串过滤:会查找与字符串完全匹配的内容

t_list = bs.find_all("a")
print(t_list)
  • 1
  • 2

5.1.1 正则表达
使用search()方法来匹配内容,寻找标签种有a,把内容显示出来

 import re   
 t_list= bs.find_all(re.compile("a"))
 print(t_list)
  • 1
  • 2
  • 3

5.1.2 引入自定义函数

 def name_is_exists(tag):
 	return tag.has_attr("class")
t_list = bs.find_all(name_is_exists)
for item in t_list:   #列表打印
	print(item)
  • 1
  • 2
  • 3
  • 4
  • 5

5.2 kwargs参数

#寻找id=head
t_list = bs.find_all(id="head")
#寻找id=link1
t_list = bs.find_all(id="link1 ")

#查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
t_list = bs.find_all(class_=True)
for item in t_list:
	 print(item)

#查询href属性包含http://example.com/elsie的Tag
t_list = bs.find_all(href="http://example.com/elsie")
print(t_list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

t_list= bs.find_all(text = "Tillie")

t_list = bs.find(text=["Tillie","Lacie"])

#应用正则表达式来查找包含特定文本的内容(标签里的字符串)
t_list = bs.find_all(text=re.compile("\d")) 
for item in t_list:
	print(item)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.4 limit 参数
可以传入一个limit参数来限制返回的数量,与sql语句中的类似

#限制返回数量limit
t_list = bs.find_all("a",limit=2)
for item in t_list:
	print(item)
  • 1
  • 2
  • 3
  • 4

5.5 find()
find()将返回符合条件的第一个Tag,有时我们只需要或一个Tag时,我们就可以用到find()方法了。当然了,也可以使用find_all()方法,传入一个limit=1,然后再取出第一个值也是可以的,不过未免繁琐。

from bs4 import BeautifulSoup 
import re 
file = open('./aa.html', 'rb') 
html = file.read() 

bs = BeautifulSoup(html, "html.parser") 

# 返回只有一个结果的列表
t_list = bs.find_all("title",limit=1) 
print(t_list) 

# 返回唯一值
t = bs.find("title") 
print(t) 

# 如果没有找到,则返回None
t = bs.find("abc") print(t)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

从结果可以看出find_all,尽管传入了limit=1,但是返回值仍然为一个列表,当我们只需要取一个值时,远不如find方法方便。但
是如果未搜索到值时,将返回一个None

6. css选择器

BeautifulSoup支持发部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag:

6.1、通过标签名查找
print(bs.select('title'))
print(bs.select('a'))

6.2、通过类名查找
print(bs.select('.mnav'))
6.3、通过id查找
print(bs.select('#u1'))
6.4、组合查找
print(bs.select('div .bri'))
6.5、属性查找
print(bs.select('a[class="bri"]'))
print(bs.select('a[href="http://tieba.baidu.com"]'))
6.6、直接子标签查找
t_list = bs.select("head > title")
print(t_list)
6.7、兄弟节点标签查找
t_list = bs.select(".mnav ~ .bri")
print(t_list)
6.8、获取内容
t_list = bs.select("title")
print(bs.select('title')[0].get_text())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

测试html代码:

<!DOCTYPE html>
<html>
<head>
    <meta content="text/html;charset=utf-8" http-equiv="content-type" />
    <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
    <meta content="always" name="referrer" />
    <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css" />
    <title>百度一下,你就知道 </title>
</head>
<body link="#0000cc">
  <div id="wrapper">
    <div id="head">
        <div class="head_wrapper">
          <div id="u1">
            <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
            <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
            <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>
            <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
            <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>
            <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>
            <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品 </a>
          </div>
        </div>
    </div>
  </div>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

参考连接:http://www.jsphp.net/python/show-24-214-1.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/140354
推荐阅读
  

闽ICP备14008679号