黑马程序员python基础班教程笔记:使
使? Beautiful Soup 解析数据
有的?伙伴们对写正则表达式的写法?得不熟练,没关系,我们还有?个更
强?的?具,叫Beautiful Soup,有了它我们可以很?便地提取出HTML或XML标签中的内容,实在是?便,这?节就让我们?起来感受?下Beautiful Soup的魅?
1. Beautiful Soup的简介
简单来说,Beautiful Soup是python的?个库,最主要的功能是从??抓取数据。官?解释如下:
Beautiful Soup提供?些简单的、python式的函数?来处理导航、搜
索、修改分析树等功能。它是?个?具箱,通过解析?档为?户提供需
要抓取的数据,因为简单,所以不需要多少代码就可以写出?个完整的
应?程序。 Beautiful Soup?动将输??档转换为Unicode编码,输出
?档转换为utf-8编码。你不需要考虑编码?式,除??档没有指定?个
编码?式,这时,Beautiful Soup就不能?动识别编码?式了。然后,
你仅仅需要说明?下原始编码?式就可以了。 Beautiful Soup已成为和lxml、html6lib?样出?的python解释器,为?户灵活地提供不同的解
析策略或强劲的速度。
2. 安装
下载地址: https://https://www.360docs.net/doc/9312518161.html,/pypi/beautifulsoup4/4.3.2
官??档: https://www.360docs.net/doc/9312518161.html,/zh_CN/latest
3. 使?
from bs4 import BeautifulSoup
我们创建?个字符串,后?的例?我们便会?它来演示
创建 beautifulsoup 对象
soup = BeautifulSoup(html)
下?我们来打印?下 soup 对象的内容,格式化输出
print soup.prettify()
3.1 找标签
我们可以利? soup加标签名轻松地获取这些标签的内容,是不是感觉?正则表达式?便多了?不过有?点是,它查找的是在所有内容中的第?个符合要
求的标签
对于标签,它有两个重要的属性,是 name 和 attrs,下?我们分别来感受?下
soup 对象本身?较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称
在这?,我们把 p 标签的所有属性打印输出了出来,得到的类型是?个字
典。
如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什
么
3.2 获取?字
既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的
?字怎么办呢?很简单,? .string 即可,例如
print soup.p.string
#The Dormouse's story
3.3 CSS选择器
在CSS中,标签名不加任何修饰,类名前加点,id名前加 #,在这?我们也
可以利?类似的?法来筛选元素,?到的?法是 soup.select(),返回类型是
list
3.3.1 通过标签名查找
print soup.select('title')
#[
3.3.2 通过类名查找
print soup.select('.sister')
#[, id="link2">Lacie href="https://www.360docs.net/doc/9312518161.html,/tillie" id="link3">Tillie
3.3.3 通过 id 名查找
print soup.select('#link1')
3.3.4 组合查找
组合查找即和写 class ?件时,标签名与类名、id名进?的组合原理是?样
的,例如查找 p 标签中,id 等于 link1的内容,?者需要?空格分开
print soup.select('p #link1')
3.3.5 直接?标签查找
print soup.select("head > title")
#[
3.3.6 属性查找
查找时还可以加?属性元素,属性需要?中括号括起来,注意属性和标签属
于同?节点,所以中间不能加空格,否则会?法匹配到。
同样,属性仍然可以与上述查找?式组合,不在同?节点的空格隔开,同?
节点的不加空格
print soup.select('p a[href="https://www.360docs.net/doc/9312518161.html,/elsie"]')
以上的 select ?法返回的结果都是列表形式,可以遍历形式输出,然后?
get_text() ?法来获取它的内容。
soup = BeautifulSoup(html, 'lxml')
print type(soup.select('title'))
print soup.select('title')[0].get_text()
for title in soup.select('title'):
print title.get_text()