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语言库
html5lib BeautifulSoup(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 = """
      
      
        TOP100榜 - 猫眼电影 - 一网打尽好电影
      
      
      
      
      """
      # 引入库包
      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)
      """
       
    • 电影
    • 电影 电影 """

父节点和祖先节点

  • 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()
  • 记住常用的获取属性和文本的方法

你可能感兴趣的:(python,爬虫)