zoukankan      html  css  js  c++  java
  • 数据提取之二:bs4

    数据提取之bs4

    • beautifulsoup支持的解析器

    • 解析器 使用方法 优势 劣势
      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格式的文档 速度慢不依赖外部扩展
    • bs4个常用的对象:

      1:tag 对象与XML或HTML原生文档中的tag相同   ---tag的属性操作方法与字典一样
      2:NavigatableString:用来包装tag中的字符串
      3:BeautifulSoup:表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象
      4:Comment:注释及特殊字符串
      
    • 基本用法

      from bs4 import BeautifulSoup
      soup=BeautifulSoup(html,'lxml')  #首先解析为Unicode文档,然后BS会选择最合适的解析器来解析这段文档,这里是指定lxml解析
      print(soup.prettify())   #把要解析的字符串以标准的格式输出
      
    • 节点选择器:单个节点结构层次非常清晰,推荐使用

      1:获取名称--name获取title的节点名称
          soup.title.name
          
      2-1:获取属性的值
         	soup.p.attres   #获取p节点的所有属性值
          soup.p.attrs['title']   #获取title的属性值
         
      2-2:[]直接获取属性的值
          soup.p["name"]
          soup.p["title"] 
          
      3:获取节点的文本内容 string
          soup.p.string
          
      4:嵌套选择---由于html文档的嵌套,bs4.element.Tag可以继续调用节点进行选择
          soup.head.title.string    #输出title的文本内容
      
          
      5:关联选择
          子节点:
          选取节点p之后,获取它的直接子节点---返回一个列表["文本","子节点"]--不会单独列出子孙节点
          soup.p.contents
          soup.p.children   #返回一个生成器,遍历输出结果
          
          子孙节点:
          soup.p.descendants  #返回一个生成器,遍历输出结果
          
          父节点:parent
          祖先节点:parents
      
      • 方法选择器
      find_(name,attes,recursive,text,**kwargs):查询所有符合条件的元素,传入一些属性或文本
          
      1:name根据节点名查找元素--返回一个列表
       
      soup.find_all(name="a")
      soup.find_all('a')
      
      
      2:attrs根据一些属性来查询
      soup.find_all('a',id="test",class_="test")    #注意class_
      href=soup.a.attrs['href']
      soup.find_all(attrs={'class':'test'})
      
      3:text参数可用来匹配节点的文本,传入的形式可以使str和正则表达式
       soup.find_all(text=re.compile('link-1.html'))
      
      
      • CSS选择器

        CSS选择器需要调用select()方法
        soup.select('.panel .panel-heading')  #class
        soup.select('#list-2 .element')       # #-id
        soup.select('ul li')   #普通标签:选择所有ul节点下的所有li节点
        
        获取属性
        遍历列表之后,Tag类型
        ul['id']
        ul.attrs['id']
        
        获取文本:get_text()
        
        for li  in soup.select('li'):
            print("Get Text:",li.get_text())
            print("String:",li.string)
            
        
      • 注意点:

        ## string和strings、stripped_strings属性以及get_text方法:
        1. string:获取某个标签下的字符串[1个]。返回来的是个字符串。
        2. strings:tag中包含【多个】字符串,子孙字符串。返回来的是个生成器。
        2. stripped_strings:输出的字符串中可能包含了很多空格或空行。返回来的是个生成器。
        4. get_text():获取到tag中包含的所有文版内容包括子孙tag中的内容,并将结果作为Unicode字符串返回
        
  • 相关阅读:
    .Net简单上传与下载
    C语言课程设计——电影院订票系统
    Git学习笔记
    浅析RPO漏洞攻击原理
    网络1911、1912 C语言第5次作业循环结构 批改总结
    MOCTF WriteUp
    Visual Studio 2019/2017 安装使用教程(快速上手版)
    南京邮电大学网络攻防平台——WriteUp(持续更新)
    java大作业博客购物车
    .Net Framework 2.0 的System.Data.SqlClient.AddWithValue()方法
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/12363991.html
Copyright © 2011-2022 走看看