py3爬虫--beautiful-soup库的使用

Beautiful soup

灵活又方便的网页解析库,处理高效,支持多种解析器。

利用它不用编写正则表达式即可方便的实现网页信息的提取

安装

pip install beautifulsoup4

引入

import bs4 from

解析库

解析器使用方法优势劣势
Python标准库BeautifulSoup(markup,"html.parser")Python的内置标准库执行速度适中文档容错能力强Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器BeautifulSoup(markup,"lxml")速度快文档容错能力强需要安装C语言库
lxml XML 解析器BeautifulSoup(markup,["lxml", "xml"])``BeautifulSoup(markup,"xml")速度快唯一支持XML的解析器需要安装C语言库
html5libBeautifulSoup(markup,"html5lib")最好的容错性以浏览器的方式解析文档生成HTML5格式的文档速度慢不依赖外部扩展

安装解析器

$pip install lxml
$pip install html5lib

基本使用

  1. 安装包 pip install beautifulsoup4 pip install lxml

  2. 引入包 from bs4 import BeautifulSoup

  3. 构建对象 soup = BeautifulSoup(html,'lxml')

  4. 使用构造对象的方法

    1. print(soup.prettify())	# 格式化代码
      
    2. print(soup.title.string) # 获取文本对象的title内容
      
    3. html = """
      <!DOCTYPE html>
      <head>
        <title>TOP100榜 - 猫眼电影 - 一网打尽好电影</title>
      </head>
      <body>
      <div class="nav">
                  <ul class="navbar">
                      <li><a href="/" data-act="home-click"  >首页</a></li>
                      <li><a href="/films" data-act="movies-click" >电影</a></li>
                      <li><a href="/cinemas" data-act="cinemas-click" >影院</a></li> 
                      <li><a href="http://www.gewara.com">演出</a></li>
                      
                      <li><a href="/board" data-act="board-click"  class="active" >榜单</a></li>
                      <li><a href="/news" data-act="hotNews-click" >热点</a></li>
                      <li><a href="/edimall"  >商城</a></li>
                  </ul>
              </div>
      
      """
      # 引入库包
      from bs4 import BeautifulSoup
      # 声明对象,传入解析器lxml
      
      soup = BeautifulSoup(html,'lxml')
      # 格式化代码
      print(soup.prettify())
      
      print(soup.title.string)
      

标签选择器

选择标签

  • soup.title
  • soup.head
  • soup.p

获取标签名称

  • soup.title.name

获取标签属性

两种都可

  • soup.a['data-act']
  • soup.a.attrs['data-act']

获取内容

  • soup.a.string

嵌套选择

  • soup.head.title.string , head标签下的title的内容

子节点和子孙节点

  • soup.ul.contents; 返回的是列表的形式

  • soup.ul.children; 返回的是迭代器,用for循环打印出了

    • for i,child in enumerate(soup.ul.children):
          print(i,child)
      
  • soup.ul.descendants; 返回的是所有子孙;

    • for i ,child in enumerate(soup.ul.descendants):
          print(i,child)
      """
       <li><a data-act="movies-click" href="/films">电影</a></li>
      
      <a data-act="movies-click" href="/films">电影</a>
      
      电影
      
      """
      

父节点和祖先节点

  • soup.ul.parent 获取的是该标签的父标签

  • soup.ul.parents 获取到是该标签的父标签,该标签的父标签的父标签

    • print(list(enumerate(soup.ul.parents)))
      

兄弟节点

  • soup.ul.li.next_siblings 获取后面的兄弟节点
  • soup.ul.li.previous_siblings 获取前面的兄弟节点

标准选择器

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

  • 可根据标签名,属性、内容查找文档

    • name

      • print(soup.find_all('a'))
        print(soup.find_all('a')[0])
        
    • attrs

      • print(soup.find_all(attrs={'class':'navbar'}))
        
        print(soup.find_all(class_='navbar'))#class比较特殊需要写成 class_
        print(soup.find_all(id='navbar'))
        
    • text

      • print(soup.find_all(text='商城'))
        
  • find(name,attrs,recursive,text,**kwargs)

find返回单个元素,find_all返回所有元素

  • findparents() & findparent()
  • find_next_siblings() & find_next_sibling()
  • find_previous_siblings() & find_previous_sibling()
  • find_all_next() & find_next()
  • find_all_previous() & find_all_previou()

css 选择器

通过select()直接传入css选择器即可完成选择

  • soup.select(’.class’)
  • soup.select(’#id’)
  • soup.select(‘ul li’)

获取属性

  • print(soup.select('a')[0]['data-act'])
    #('a')[0]是第一个a标签
    #('a')[0]['data-act']是第一个a标签的data-act属性值
    

获取内容

  • print(soup.select('a')[0].get_text())
    

总结

  • 推荐使用lxml解析库,必要时使用html.parser
  • 标签选择筛选功能弱但是速度快
  • 建议使用find(),find_all()查询匹配单个结果或者多个结果
  • 如果对css选择器实习建议使用select()
  • 记住常用的获取属性和文本的方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值