zoukankan      html  css  js  c++  java
  • beautifulsoup4库的应用

    python安装 bs4和 beautifulsoup4库,可以 pip3 install bs4 , pip3 install beautifulsoup4安装

    beautifulsoup库是做网页代码的处理,可以在爬虫中使用,比正则表达式要简略

    可以用如下方法调用,python标准库是不需要再安装别的库,例如 lxml html就需要安装 lxml解析库,以此类推。

    一般使用 lxml 较多

    Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库、执行速度适中 、文档容错能力强 Python 2.7.3 or 3.2.2)前的版本中文容错能力差
    lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快、文档容错能力强 需要安装C语言库
    lxml XML 解析器 BeautifulSoup(markup, "xml") 速度快、唯一支持XML的解析器 需要安装C语言库
    html5lib BeautifulSoup(markup, "html5lib") 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展

    1、基本使用

    from bs4 import BeautifulSoup
    
    html = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>The Dormouse's story</b></p>
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    <p class="story">...</p>
    """
    soup = BeautifulSoup(html, "html.parser")
    print(soup.prettify())
    print(soup.title.string)

    例如一段残缺的 html文件,可以把它标签补齐

     soup.prettify()  格式化代码,自动补全标签

    soup.title  获取 title信息

     2、标签选择器  选择标签

    print(soup.title)  <title>The Dormouse's story</title>
    print(type(soup.title))  <class 'bs4.element.Tag'>
    print(soup.title.name)  title
    print(soup.title.string)  The Dormouse's story
    print(soup.p['name'])
    print(soup.p.string)
    print(soup.head.title.string)

    3、标准选择器

      find_all( name , attrs , recursive , text , **kwargs )

    根据 name 查询,查找所有的 ‘name'标签


    from
    bs4 import BeautifulSoup html=''' <div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <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') print(soup.find_all('ul')) print(type(soup.find_all('ul')[0])) for ul in soup.find_all('ul'): print(ul.find_all('li'))
    [<ul class="list" id="list-1">
    <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>]
    <class 'bs4.element.Tag'>
    [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
    [<li class="element">Foo</li>, <li class="element">Bar</li>]
    find_all 结果

    根据 attars 查询

    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>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.find_all(attrs={'id': 'list-1'}))
    print(soup.find_all(attrs={'name': 'elements'}))

    attrs传入的是字典形式的内容,但是当一些通用的,例如 id name 的关键词,可以省略 attrs

    print(soup.find_all(id='list-1'))
    print(soup.find_all(class_='element'))
    [<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" id="list-1" name="elements">
    <li class="element">Foo</li>
    <li class="element">Bar</li>
    <li class="element">Jay</li>
    </ul>]
    
    Process finished with exit code 0
    attrs 运行结果

    根据 text查询

    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>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.find_all(text='Foo')

    返回结果  ['Foo', 'Foo']

    根据 text查询的结果 匹配的是一样的文本内容,返回所有匹配一样的内容

    find( name , attrs , recursive , text , **kwargs )

    查询匹配单个,首个内容


    find_parents() find_parent()

    
    
     

    find_parents()返回所有祖先节点,find_parent()返回直接父节点。

    
    
     

    find_next_siblings() find_next_sibling()

    
    
     

    find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。

    
    
     

    find_previous_siblings() find_previous_sibling()

    
    
     

    find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。

    
    
     

    find_all_next() find_next()

    
    
     

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

    
    
     

    find_all_previous() 和 find_previous()

    
    
     

    find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

    4、CSS选择器


    通过select()直接传入CSS选择器即可完成选择

    如果要匹配 类 class  那么在前面添加 “.”

    如果要匹配 id  那么在前面添加 "#"

    如果匹配标签  直接写入标签名称,多个标签嵌套中间加空格

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1">
                <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>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.select('.panel .panel-heading'))
    print(soup.select('ul li'))
    print(soup.select('#list-2 .element'))
    print(type(soup.select('ul')[0]))
    [<div class="panel-heading">
    <h4>Hello</h4>
    </div>]
    [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>]
    [<li class="element">Foo</li>, <li class="element">Bar</li>]
    <class 'bs4.element.Tag'>
    CSS结果

    5、获取属性

     获取标签属性,在后面加 [ ]即可,例如获取 ul标签的 id属性,注意,select匹配的结果是个列表,需要迭代取出单个数据才能进行下一步匹配内容

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1">
                <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>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    for ul in soup.select('ul'):
        print(ul['id'])
        print(ul.attrs['id'])

    获取内容,li.get_text()

    for li in soup.select('li'):
        print(li.get_text())
    
    #Foo
    #Bar
    #Jay
    #Foo
    #Bar
  • 相关阅读:
    团队作业3-需求分析设计
    团队作业2
    Gakki赛高-团队介绍
    201521123002 《Java程序设计》第2周学习总结
    201521123002 《Java程序设计》第1周学习总结
    201521123067《Java程序设计》第1周学习总结
    团队作业4--第一次项目冲刺(Alpha版本)7
    团队作业4--第一次项目冲刺(Alpha版本)6
    团队作业4--第一次项目冲刺(Alpha版本) 5
    团队作业4--第一次项目冲刺(Alpha版本) 4
  • 原文地址:https://www.cnblogs.com/yxlll/p/13576154.html
Copyright © 2011-2022 走看看