Python爬虫之BeautifulSoup库

标签: 爬虫

1、BeautifulSoup库的介绍

  因为HTML代码一般具有规律性,使用正则表达式解析的话在编写时难度较大,也容易出错。所以我们可以使用BeautifulSoup库,这个库借助网页的结构和属性等特性来解析网页,十分方便。它提供了许多种不同的API,可以实现不同标签不同属性的选择。以下是BeautifulSoup的优点:

  1. BeautifulSoup提供一些简单的API来处理导航、搜索、修改分析树等功能
    。因为简单,所以不需要多少代码就可以写出一个完整的应用程序;
  2. BeautifulSoup自动将输入文档转化为Unicode 编码,输出文档转换为UTF-8编码 你不需妥考虑编码方式 ,除非文档没有指 一个编码方式,这时你仅仅需妥说明一下原始编码方式就可以了;
  3. Beautiful Soup 成为和lxml、html6lib 一样出色的 Python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

  BeautifulSoup实际上是对解析器的封装,所以底层依赖于解析器,默认使用Python内置解析器。因为lxml库性能好,所以接下来的代码使用BeautifulSoup+lxml解析。
在这里插入图片描述

2、常用API介绍

2.1、prettify()

prettify()是将字符串弄出标准的HTML缩进格式:

    text = """
        <html><head><title>得分榜</title></head>
                <body><tr>
                    <td width="46">48</td>
                    <td width="142" class="left"><a href="https://nba.hupu.com/players/terryrozier-150005.html">特里-罗齐尔</a></td>
                    <td width="50"><a href="https://nba.hupu.com/teams/hornets">黄蜂</a></td>
                    <td class="bg_b">18.00</td>
                    <td>6.30-14.90</td>
                    <td>42.3%</td>
                    <td>2.70-6.70</td>
                    <td>40.7%</td>
                    <td>2.60-3.00</td>
                    <td>87.4%</td>
                    <td width="50">63</td>
                    <td width="70">34.30</td>
                </tr></body></html>"""
    soup = BeautifulSoup(text,'lxml')
    print(soup.prettify())

2.2、简单选择元素并获取属性、内容

	soup = BeautifulSoup(text,'lxml')
    print(soup.title)     # 当HTML中该标签只有一个时,输出该标签  
    print(soup.td)        # 当HTML中该标签具有多个时,输出第一个
    
    print(soup.title.name)     # 获取标签名
    print(soup.a.attrs)        # 获取属性,返回字典
    print(soup.a.attrs['href'])		#根据字典的key获取属性
    print(soup.a.string)       # 获取内容

2.3、多级选择、关联选择

	soup = BeautifulSoup(text,'lxml')
    print(soup.tr.contents)     #返回子标签或文本组成的列表
    print(soup.tr.children)     # 返回子标签或文本组成的迭代器
    for i in soup.tr.children:
        print(i)
    print('--------------------------------------------')
    print(soup.tr.descendants)
    for i in soup.tr.descendants:   # 返回后代元素
        print(i)

 &emsp类似的还有父节点(parent)、祖先节点(parents)、兄弟节点(next_siblings、previous_siblings)等等。

2.4、find_all()等方法

	soup = BeautifulSoup(text,'lxml')
    aList = soup.find_all(name='a')     # 传入标签名
    for a in aList:
        print(a.attrs['href'])

    tds = soup.find_all(attrs={'width':46})     # 获得带有width属性为46的标签
    print(tds)

  与之类似的方法还有find()、find_parents ()和 find_parent ()、find_next_siblings ()、find_next_ sibling()、
find_previous_siblings()和 find_previous_sibling()等方法,使用方式基本一致。

2.5、CSS选择器

  可以使用select()选择元素,其方式与CSS选择器一样:

soup = BeautifulSoup(text,'lxml')
    result1 = soup.select('.left')   # 选择class属性为left的标签
    print(result1[0].string)
    result2 = soup.select(('td'))   # 选择td标签
    print(result2)
    result3 = soup.select('title , .left')  # 选择class属性为left的标签和title标签
    print(result3)

具体规则可以查看:CSS选择器

3、总结

  1. 推荐使用lxml作为解析器,如果安装不成功就使用默认解析器;
  2. 推荐使用select(),前提是对CSS较为熟悉;
  3. 如果对jQuery熟悉的话,推荐使用下一篇博客使用的pyquery库。

有错误的地方敬请指出!觉得写得可以的话麻烦给个赞!欢迎大家评论区或者私信交流!

版权声明:本文为Orange_minger原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Orange_minger/article/details/104837222