zoukankan      html  css  js  c++  java
  • Py之解析库BeautifulSoup学习

    1.基本用法

    >>> from bs4 import BeautifulSoup
    >>> soup=BeautifulSoup('<p>Hello</p>','lxml')
    >>> soup.p.string
    'Hello'

    2. 节点选择

    选择元素

    >>> html="""
    <ul class="topnav-noauth clearfix">
    <li>
    <a href="javascript:;" class="js-signup-noauth"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    <li>
    <a href="javascript:;" class="js-signin-noauth">登录</a>
    </li>
    </ul>
    >>> h=BeautifulSoup(html,'lxml')
    >>> h
    <html><body><ul class="topnav-noauth clearfix">
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    <li>
    <a class="js-signin-noauth" href="javascript:;">登录</a>
    </li>
    </ul>
    </body></html>
    >>> h.ul
    <ul class="topnav-noauth clearfix">
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    <li>
    <a class="js-signin-noauth" href="javascript:;">登录</a>
    </li>
    </ul>
    >>> h.a.string
    >>> 

    //在赋值html时,需要使用三个“”“ ,并且换行后粘贴内容。

    获取属性

    >>> h.a['href']
    'javascript:;'
    >>> h.i['class']
    ['zg-icon', 'zg-icon-dd-home']
    >>> h.a['class']
    ['js-signup-noauth']

    直接使用[]获取即可,但是只识别当前html中出现的第一个标签, 如果属性有多个则组成list。

    获取内容

    >>> h.li.string
    >>> h.i.string
    >>> h.a.string

    //很奇怪这里的a为什么获取不到?理应出现:注册知乎。

    嵌套选择

    >>> h.ul.li
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>

    3.关联选择

    子节点和子孙节点

    -获取直接子节点,使用contents,返回的是列表类型的。

    >>> h.li.contents
    ['
    ', <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, '
    ']

    -和上面一样,但是返回的是生成器类型的,使用枚举遍历。

    >>> ch=h.li.children
    >>> for i,c in enumerate(ch)
    SyntaxError: invalid syntax
    >>> for i,c in enumerate(ch):
        print(i,c)
    
    0 
    
    1 <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    2 

    要想层次地遍历以获取内部全部标签:

    >>> de=h.li.descendants
    >>> for i,d in enumerate(de):
        print(i,d)
    
    0 
    
    1 <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    2 <i class="zg-icon zg-icon-dd-home"></i>
    3 注册知乎
    4 
    
    >>> 

     父节点和祖先节点

    >>> h.i.parent #父亲节点
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    >>> h.li.next_sibling #兄弟节点
    '
    '
    >>> list(enumerate(h.li.next_sibling))
    [(0, '
    ')]
    >>> list(enumerate(h.ul.next_sibling))
    [(0, '
    ')]
    >>> list(enumerate(h.a.next_sibling))
    [(0, '
    ')]
    >>> list(enumerate(h.i.next_sibling))
    [(0, ''), (1, ''), (2, ''), (3, '')]
    >>> 

     4.提取信息

    >>> list(h.a.parents)[0]
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    >>> list(h.a.parents)[1].attrs['class']
    ['topnav-noauth', 'clearfix']

     这里使用parents,是generator类型,先将其转换为list类型。

    5.方法选择器

    find_all()

    根据标签名查找

    >>> h.find_all(name='li')
    [<li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>, <li>
    <a class="js-signin-noauth" href="javascript:;">登录</a>
    </li>]
    >>> h.find_all(name='a')
    [<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, 
    <a class="js-signin-noauth" href="javascript:;">登录</a>]

    >>> h.find_all(name='a')[0]
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>

    根据属性名查找

    >>> h.find_all(attrs={'href':'javascript:;'})
    [<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, 
    <a class="js-signin-noauth" href="javascript:;">登录</a>]

    属性是字典。

    text匹配节点文本

    >>> h.find_all(text=re.compile(''))
    ['登录']

    find() //只返回第一个匹配的

    >>> h.find(name='li')
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    >>> h.find_all(name='li')
    [<li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>, <li>
    <a class="js-signin-noauth" href="javascript:;">登录</a>
    </li>]

    6.CSS选择器

    >>> html="""
    <ul class="topnav-noauth clearfix">
    <li>
    <a href="javascript:;" class="js-signup-noauth"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    <li>
    <a href="javascript:;" class="js-signin-noauth">登录</a>
    </li>
    </ul>
    """
    >>> h=BeautifulSoup(html,'lxml')
    >>> h.select('.clearfix')
    [<ul class="topnav-noauth clearfix">
    <li>
    <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
    </li>
    <li>
    <a class="js-signin-noauth" href="javascript:;">登录</a>
    </li>
    </ul>]
    >>> h.select('.zg-ico')
    []
  • 相关阅读:
    cmd常用命令大全
    网卡物理地址
    想看密码的请心平气和听我说
    作为一个程序员仪表
    960,950栅格化方法
    为什么要拿宽960做栅格化呢
    960栅格化优势
    虎牌 查询 自选号
    视频
    在线学习视频地址
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/11037207.html
Copyright © 2011-2022 走看看