Data extraction of bs4

Data extraction of bs4

  • beautifulsoup support parser

  • Parser Instructions Advantage Disadvantaged
    Python Standard Library BeautifulSoup(markup, "html.parser") Built-in standard Python library execution speed of moderate intensity document fault tolerance Version of Python 2.7.3 or 3.2.2) before the document fault tolerance poor
    lxml HTML parser BeautifulSoup(markup, "lxml") Strong speed document fault tolerance You need to install the C language library
    lxml XML parser BeautifulSoup(markup, ["lxml-xml"])``BeautifulSoup(markup, "xml") The only support fast XML parser You need to install the C language library
    html5lib BeautifulSoup(markup, "html5lib") The best fault tolerance to the way the browser parses the document format document generation HTML5 Does not depend on external expansion slow
  • bs4 commonly used objects:

    1:tag 对象与XML或HTML原生文档中的tag相同   ---tag的属性操作方法与字典一样
    2:NavigatableString:用来包装tag中的字符串
    3:BeautifulSoup
    4:Comment
  • Basic Usage

    from bs4 import BeautifulSoup
    soup=BeautifulSoup(html,'lxml')  #首先解析为Unicode文档,然后BS会选择最合适的解析器来解析这段文档,这里是指定lxml解析
    print(soup.prettify())   #把要解析的字符串以标准的格式输出
  • Node Selector: single hierarchy of nodes is very clear, it is recommended to use

    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
    • Method selector
    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 selectors

      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)
      
    • important point:

      ## string和strings、stripped_strings属性以及get_text方法:
      1. string:获取某个标签下的字符串[1个]。返回来的是个字符串。
      2. strings:tag中包含【多个】字符串,子孙字符串。返回来的是个生成器。
      2. stripped_strings:输出的字符串中可能包含了很多空格或空行。返回来的是个生成器。
      4. get_text():获取某个标签下的所有字符串内容。以普通字符串返回。

Guess you like

Origin www.cnblogs.com/zhoujun007/p/12363991.html