zoukankan      html  css  js  c++  java
  • Python爬虫学习(三)Beautiful Soup库

    快速使用

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html,'lxml')

    一、基本使用

    1、标签选择器  soup.标签名---获取这个标签内容,如果有多个该标签,就返回第一个

    • 获取名称 soup.title.name
    • 获取属性 soup.p.attrs['name']  /  soup.p['name']
    • 获取内容 soup.p.string
    • 嵌套选择 soup.head.title.string
    • 子节点和子孙结点
      •   contents的用法
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html,'lxml')
    print(soup.p.contents) #将p标签下所有的子标签存入到一个列表中
      •   children的使用 -- 但是一个迭代对象,而不是列表,只能通过循环的方式获得
    print(soup.p.children)
    
    for i,child in enumerate(soup.p.children):
            print(i,child)
      •   descendants  子孙节点--也是迭代器

            print(soup.descendants)

      •   父结点和祖先节点

            soup.a.parent  -- 获取父节点信息

            list( enumerate(soup.a.parents) ) -- 获取祖先节点的信息

      •   兄弟节点

            soup.a.next_siblings  获取后面的兄弟节点

            soup.a.previous_sibling 获取前面兄弟节点

            soup.a.next_sibling 获取下一个兄弟标签

            soup.a.previous_sibling 获取上一个兄弟标签

    2、标准选择器

    find_all( name, attrs, recursive, text, **kwargs )  根据标签名,属性,内容查找文档

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1" name="elements">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
                <li class="element">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    soup = BeautifulSoup( html,'lxml' )
    
    #根据name  
    #获取ul 循环获取内部的li标签信息
    for ul in soup.find_all( 'ul' ):
            print( ul.find_all('li') )
    
    #根据attrs
    #注意:查找class相关的 修改attrs = { 'class_' : 'element' }  或者 soup.find_all( "",{ 'class':'element' } )
    print( soup.find_all(attrs={ 'id':'list-1' }) )
    print( soup.find_all(attrs={ 'name':'elements' }) )
    
    #根据text
    print(soup.find_all( text='Foo' ))

    find(name, attrs, recursive, text, **kwargs) -- 返回匹配结果的第一个元素

    其他类似用法:

    find_parents() 返回所有祖先节点 find_parentd()返回直接父结点

    find_next_silings() 返回后面所有的兄弟节点 find_next_sibling() 返回第一个

    find_previous_siblings()  find_previous_sibling()

    find_all_next() 返回节点后所符合条件的结点   find_next()返回第一个符合条件的节点

    find_all_previous() find_previous()

    3、css选择器

    通过select()直接传入css选择器

    规则: 

    • .表示class  #表示id
    • 标签1,标签2  -- 找到所有的标签1和标签2
    • 标签1 标签2  -- 找到所有标签1内部的标签2
    • [ attr ] 找到具有某个属性的所有标签
    • [ attr=value ] 找到所有属性值等于value的标签

     

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html,'lxml')
    
    soup.select('.panel .panel-heading')  #返回class为panel中class为panel-heading的标签
    
    soup.select('ul li')  #返回所有ul中的li标签
    
    soup.select('#list-2 .element') #返回id为list-2 类为element的所有标签
    
    soup.select('ul')[0] #返回第一个ul标签中的标签  

    4、获取内容 get_text()

    5、获取属性 [属性名] 或者 .attrs[属性名]

    for ul in soup.select('ul'):
            print(ul['id'])
            print(ul.attrs['id'])
  • 相关阅读:
    Fragment_3_Androidx中返回键的处理
    2.2.3.Architecture components_View Binding
    2.2.2.Architecture components_data binding2_源码分析
    经典排序
    动态规划求解最长公共子序列
    全排列问题
    钢条切割
    KMP
    Queue
    Stack
  • 原文地址:https://www.cnblogs.com/cola-1998/p/12829321.html
Copyright © 2011-2022 走看看