beautiful soup爬虫初识

发布时间:2018-06-22 17:41:55编辑:Run阅读(4917)

    Beautiful Soup的安装,简称bs4

    pip3 install bs4


    bs4解析器选择

    解析器使用方法优势
    劣势
    Python标准库BeautifulSoup(markup, "html.parser")

    Python的内置标准库

    执行速度适中

    文档容错能力强

    Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
    lxml HTML 解析器BeautifulSoup(markup, "lxml")

    速度快

    文档容错能力强

    需要安装C语言库
    lxml XML 解析器

    BeautifulSoup(markup, ["lxml-xml"])


    BeautifulSoup(markup, "xml")

    速度快

    唯一支持XML的解析器

    需要安装C语言库
    html5libBeautifulSoup(markup, "html5lib")

    最好的容错性

    以浏览器的方式解析文档

    生成HTML5格式的文档

    速度慢

    不依赖外部扩展

    官方推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定


    lxml解析器安装

    pip3 install lxml


    使用bs4过滤器

    自建示例文件scenery.html文件的内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>武汉旅游景点</title>
        <meta name="description" content="武汉旅游景点 精简版" />
        <meta name="author" content="hstking">
    </head>
    <body>
        <div id="content">
            <div class="title">
                <h3>武汉景点</h3>
            </div>
            <ul class="table">
                <li>景点<a>门票价格</a></li>
            </ul>
            <ul class="content">
                <li nu="1">东湖 <a class="price">60</a></li>
                <li nu="2">磨山 <a class="price">60</a></li>
                <li nu="3">欢乐谷 <a class="price">108</a></li>
                <li nu="4">武昌极地海洋世界 <a class="price">150</a></li>
                <li nu="5">玛雅水上乐园 <a class="price">150</a></li>
            </ul>
        </div>
    
    </body>
    </html>


    使用lxml解析器,打印scenery.html内容

    from bs4 import BeautifulSoup
    
    # 使用lxml解析器
    soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
    # prettify按标准的缩进格式的结构输出
    print(soup.prettify())

    执行结果:  按照标准的缩进格式的结构输出

    blob.png


    bs4解析器lxml练习:

    #!/usr/bin/env python
    # coding: utf-8
    from bs4 import BeautifulSoup
    
    # 使用lxml解析器
    soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
    # prettify按标准的缩进格式的结构输出
    print(soup.prettify())
    
    # 获取第一次出现的标签名为ul的标签内容
    print(soup.ul)
    print('\n')
    
    # 使用bs4过滤器soup.find()的方法获取第一次出现的标签内容
    print(soup.find('ul'))
    print('\n')
    
    # 使用soup.find_all方法获取所有符合条件的标签列表,然后从列表中读取就行了
    print(soup.find_all('ul'))  # 获取所有ul中所有内容
    print('\n')
    
    print(soup.find_all('ul')[0])  # 获取第一个ul中的所有内容
    print('\n')
    
    print(soup.find_all('ul')[1])  # 获取第二个ul中的所有内容
    print('\n')
    
    # 可以用soup.find(TagName, attrs={attrName:attrValue})的方法获取Tag的位置
    # 获取li标签nu='3'的内容,适用标签名相同,属性不同的标签
    print(soup.find('li', attrs={'nu': '3'}))
    print('\n')
    
    # 标签名相同,属性相同,连属性值都相同的标签
    # 可以用soup.find_all(TagName,attr={'attName':'attValue'})将符合条件的内容全部放到列表里面
    # 找a标签,class='price'的第一个内容
    print(soup.find_all('a', attrs={'class': 'price'})[0])
    print('\n')
    
    # 获取li标签,nu='2'的内容
    Tags = soup.find('li', attrs={'nu': '2'})
    print(Tags)
    print(Tags.a)  # 获取nu='2'里面的a标签内容
    print(Tags.find('a'))  # 获取nu='2'里面的a标签内容
    print('\n')
    
    # 获取li标签,nu='4'的内容
    Tag = soup.find('li', attrs={'nu': '4'})
    print(Tag)
    
    # 获取li标签,nu='4'中nu的值
    print(Tag.get('nu'))
    
    # 获取li标签,nu='4'中的文本内容
    ss = Tag.get_text()
    print(ss)
    
    # 以空格切割上面文本内容拿到第一个值
    print(Tag.get_text().split(' ')[0])
    
    # 获取li标签下a标签的文本内容
    print(Tag.a.get_text())


关键字

上一篇: 没有了

下一篇: bs4爬虫实战一:获取百度贴吧内容