• BeautifulSoup库


    '''灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便的实现网页信息的提取。'''

    BeautifulSoup库包含的一些解析库:

    解析库      使用方法              优势                              劣势

    python标准库   BeautifulSoup(markup,"html.parser")  python内置标准库、执行速度适中、文档容错能力强         python 2.7.0 or 3.2.2前的版本中文容错能力差

    lxml HTML解析库  BeautifulSoup(markup,"lxml")      速度快、文档容错能力强                     需要安装C语言库

    lxml XML解析库  BeautifulSuop(markup,"xml")       速度快、唯一支持XML的解析库                  需要安装C语言库

    html5lib        BeautifulSoup(markup,"html5lib")     最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档   速度慢、不依赖外部扩展

    '''基本使用'''
    html = '''
    <html lang="zh-cn">
    <head>
    <title>翱游 - 博客园</title>
    </head>
    <body>
    <p class="tab" name="morning">
    good night
    <a name="top" href="http://www.123.com">
    <span>wisir</span>
    </a>
    <a href="hello.cn">hh</a>
    <a href="man.cn">man</a>
    </p>
    <p class="cp" name="dromouse">hello,world</p>
    <p>...</p>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,"lxml")
    print(soup.prettify()) #自动格式化输出与补全代码

    '''标签选择器'''
    print("-标签选择器-"*20)
    #选择元素:返回匹配的第一个元素
    print(type(soup.title),soup.title)
    print(soup.p)
    #获取名称
    print(soup.title.name)
    #获取属性
    print(soup.p.attrs['name'])
    print(soup.p['name'])
    #获取内容
    print(soup.title.string)
    #嵌套选择
    print(soup.head.title.string)
    #子节点和子孙节点
    print(soup.p.contents) #返回以子节点为元素的列表
    print(soup.p.children) #.children得到的是一个迭代器对象,.contents得到的是一个列表
    for i,child in enumerate(soup.p.children):
    print(i,child)
    print(soup.p.descendants) #.descendants获取所有的子孙节点
    for i,child in enumerate(soup.p.descendants):
    print(i,child)
    #父节点和祖先结点
    print(soup.a.parent) #输出父节点
    print(list(enumerate(soup.a.parents))) #输出祖先结点,层层向上
    #兄弟节点
    print(list(enumerate(soup.a.next_siblings))) #输出所有的后兄弟节点
    print(list(enumerate(soup.a.previous_siblings))) #输出所有的前兄弟节点

    '''find_all(name,attrs,recursive,text,**kwargs):可根据标签名、属性、内容查找文档'''
    print("-find_all-"*20)
    html = '''
    <div class="panel">
    <div class="panel-heading">
    <h4>Hello</h4>
    </div>
    <div class="panel-body">
    <ul class="list" id="list-1" name="element">
    <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
    print(soup.find_all('ul'))
    print(type(soup.find_all("ul")[0]))
    #attrs
    print(soup.find_all(attrs={"id":"list-1"}))
    print(soup.find_all(attrs={"name":"element"}))
    #text
    print(soup.find_all(text="Foo"))

    '''find(name,attrs,recursive,text,**kwargs):返回find_all方法的第一个元素'''
    print(soup.find("ul"))

    '''
    find_parents()与find_parents
    find_next_siblings()与find_next_sibling()
    find_previous_siblings()与find_previous_sibling()
    find_all_next()与find_next()
    find_all_previous()和find_previous()
    同find_all()与find()
    '''

    '''CSS选择器'''
    print("-CSS选择器-"*20)
    #通过select直接传入CSS选择器即可完成选择,返回符合要求的所有结果为元素的列表
    print(soup.select('.panel .panel-heading')) #类选择器前加.,层级选择器之间加空格
    print(soup.select('ul li'))
    print(soup.select('#list-2 .element'))
    print(type(soup.select('ul')[0]))
    #获取属性
    for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])
    #获取内容
    for li in soup.select('li'):
    print(li.get_text())

    '''
    总结:
    推荐使用lxml解析库,必要时使用html.parser
    标签选择筛选功能弱但是速度快
    建议使用find()、find_all()查询匹配单个结果或多个结果
    如果对CSS选择器熟悉建议使用select()
    记住常用的获取属性和文本值的方法
    '''













  • 相关阅读:
    C#使用反射得到属性然后创建xml文档
    android多种方式实现异步加载图片
    Linux小结
    ThinkPHP5小结
    redis小结
    Android AIDL使用详解
    广播接收器 broadcast sendOrderedBroadcast android
    Android之ContentProvider总结
    ContentProvider实例整理
    Android网络编程之Socket&Http
  • 原文地址:https://www.cnblogs.com/wisir/p/10027533.html
Copyright © 2020-2023  润新知