6

Python3操作BeautifulSoup基础语法

 2 years ago
source link: https://blog.51cto.com/u_13717475/5370922
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python3操作BeautifulSoup基础语法

原创

BeautifulSoup 常用语法讲解

BeautifulSoup默认支持Python的标准HTML解析库,但是它也支持一些第三方的解析库

解析库 使用方法 优势 劣势
Python标准库 BeautifulSoup(html,’html.parser’) Python内置标准库;执行速度快 容错能力较差
lxml HTML解析库 BeautifulSoup(html,’lxml’) 速度快;容错能力强 需要安装,需要C语言库
lxml XML解析库 BeautifulSoup(html,[‘lxml’,’xml’]) 速度快;容错能力强;支持XML格式 需要C语言库
htm5lib解析库 BeautifulSoup(html,’htm5llib’) 以浏览器方式解析,最好的容错性 速度慢

demo html

<!DOCTYPE html>
<!--STATUS OK-->
<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 rel="nofollow" class="mnav" href="http://news.baidu.com" name="tj_trnews">
       新闻 </a>
      <a rel="nofollow" class="mnav" href="https://www.hao123.com" name="tj_trhao123">
       hao123 </a>
      <a rel="nofollow" class="mnav" href="http://map.baidu.com" name="tj_trmap">
       地图 </a>
      <a rel="nofollow" class="mnav" href="http://v.baidu.com" name="tj_trvideo">
       视频 </a>
      <a rel="nofollow" class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">
       贴吧 </a>
      <a rel="nofollow" class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">
       更多产品 </a>
     </div>
    </div>
   </div>
  </div>
 </body>
</html>

创建beautifulsoup4对象

from bs4 import BeautifulSoup

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

# 缩进格式
print(soup.prettify())

# 获取title标签的所有内容
print(soup.title)
#Output:<title>百度一下,你就知道 </title>

# 获取title标签的名称
print(soup.title.name)
#Output:title

# 获取title标签的文本内容
print(soup.title.string)
#Output:百度一下,你就知道

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

# 获取第一个div标签中的所有内容
print(soup.div)

# 获取第一个div标签的id的值
print(soup.div["id"])

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

# 获取所有的a标签中的所有内容
print(soup.find_all("a"))

# 获取id="u1"
print(soup.find(id="u1"))

# 获取所有的a标签,并遍历打印a标签中的href的值
for item in soup.find_all("a"):
	print(item.get("href"))

# 获取所有的a标签,并遍历打印a标签的文本值
for item in soup.find_all("a"):
	print(item.get_text())

BeautifulSoup4四大对象种类

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

  • Tag:通俗点讲就是HTML中的一个个标签

      from soup4 import BeautifulSoup
      soup = BeautifulSoup(html,"html.parser")
    
      # 获取title标签的所有内容
      print(soup.title)
    
      # 获取head标签的所有内容
      print(soup.head)
    
      # 获取第一个a标签的所有内容
      print(soup.a)
    
      # 类型
      print(type(soup.a
    
      #soup 对象本身比较特殊,它的 name 即为 [document]
      print(soup.name)
    
      # head
      #对于其他内部标签,输出的值便为标签本身的名称
      print(soup.head.name)
    
      # 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
      print(soup.a.attrs)
    
      #还可以利用get方法,传入属性的名称,二者是等价的
      print(soup.a['class']) # soup.a.get('class')
    
      # 可以对这些属性和内容等等进行修改
      soup.a['class'] = "newClass"
      print(soup.a)
    
      # 还可以对这个属性进行删除
      del soup.a['class']
      print(soup.a)
    
  • NavigableString: 获取标签内部的文字用 .string 即可

      print(soup.title.string)
    
      print(type(soup.title.string))
    
  • BeautifulSoup: 表示的是一个文档的内容

      print(type(soup.name))
    
      print(soup.name)
    
      print(soup.attrs)
    
  • Comment: 是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

    print(soup.a)  # 此时不能出现空格和换行符,a标签如下:
    # <a rel="nofollow" class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
    
    print(soup.a.string) # 新闻
    
    print(type(soup.a.string)) # <class 'soup4.element.Comment'>
    

遍历文档树

  • .contents:获取Tag的所有子节点,返回一个list
# tag的.content 属性可以将tag的子节点以列表的方式输出
print(soup.head.contents)

# 用列表索引来获取它的某一个元素
print(soup.head.contents[1])
  • .children:获取Tag的所有子节点,返回一个生成器
for child in  soup.body.children:
    print(child)

搜索文档树

  • find_all(name, attrs, recursive, text, **kwargs)

    • name参数

      • 字符串过滤:会查找与字符串完全匹配的内容
        a_list = soup.find_all("a")
        print(a_list)
      
      • 正则表达式过:如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容
        item_list = soup.find_all(re.compile("a"))
        for item in item_list:
            print(item)
      
      • 列表: 如果传入一个列表,BeautifulSoup4将会与列表中的任一元素匹配到的节点返回
        item_list = soup.find_all(["meta","link"])
        for item in item_list:
            print(item)
      
      • 方法: 传入一个方法,根据方法来匹配
      def name_is_exists(tag):
        return tag.has_attr("name")
      
      item_list = soup.find_all(name_is_exists)
      for item in item_list:
          print(item)
      
    • kwargs参数

        # 查询id=head的Tag
        item_list = soup.find_all(id="head")
        print(item_list)
      
        # 查询href属性包含ss1.bdstatic.com的Tag
        item_list = soup.find_all(href=re.compile("http://news.baidu.com"))
        print(item_list)
      
        # 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
        item_list = soup.find_all(class_=True)
        for item in item_list:
            print(item)
      
    • attrs参数

    并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data-*属性,我们可以使用attrs参数,定义一个字典来搜索包含特殊属性的tag:

    item_list = soup.find_all(attrs={"data-foo":"value"})
    for item in item_list:
        print(item)
    
    • text参数

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

    item_list = soup.find_all(attrs={"data-foo": "value"})
    for item in item_list:
        print(item)
    
    item_list = soup.find_all(text="hao123")
    for item in item_list:
        print(item)
    
    item_list = soup.find_all(text=["hao123", "地图", "贴吧"])
    for item in item_list:
        print(item)
    
    item_list = soup.find_all(text=re.compile("\d"))
    for item in item_list:
        print(item)
    
    • limit参数

    传入一个limit参数来限制返回的数量

    item_list = soup.find_all("a",limit=2)
    for item in item_list:
        print(item)
    

返回符合条件的第一个Tag,即当我们要取一个值的时候就可以用这个方法

t = soup.div.div

# 等价于
t = soup.find("div").find("div")

CSS选择器

  • 通过标签名查找
print(soup.select('title'))

print(soup.select('a'))
  • 通过类名查找
print(soup.select('.mnav'))
  • 通过id查找
print(soup.select('#u1'))
print(soup.select('div .bri'))
print(soup.select('a[class="bri"]'))
print(soup.select('a[href="http://tieba.baidu.com"]'))
item_list = soup.select("title")
print(soup.select('title')[0].get_text())
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK