BeautifulSoup
BeautifulSoup可以用来方便的解析html数据。作为一名数据分析师,我们有时需要爬点外部数据分析,不需要全部掌握这个包的内容。我们还是什么有用学什么,能解决问题,交上作业即可。
1.1 最简案例
加载包
from bs4 import BeautifulSoup as BS
创建一个html格式字符串,注意html的数据的结构
html="""
<html>
<head>
<title> beautiful soup 学习 </title>
</head>
<body>
<ul>
<li class='c1'> 产品1 </li>
<li class='c1'> 产品2 </li>
<li class='c2'> 产品3 </li>
<li> 产品4 </li>
</ul>
<ul>
<a href='www.abc.com/products/1.html' class='c1 c3' />
<a href='www.abc.com/products/2.html' class='c1' />
<a href='www.abc.com/products/3.html' class='c1' />
</ul>
</body>
</html>
"""
创建一个BeautifulSoup对象
bs = BS(html)
获取网页的head、body、title、和li对象,在bs中都是一个元素标签
bs.head #获取网页头
bs.body #获取网页身体
bs.title #获取网页标题
bs.li #获取li,注意有两个li,但是只返回第一个。
使用元素text属性,获取标题文本
bs.title.text #返回 ' beautiful soup 学习 '
bs.li.text #返回 ' 产品1 '
1.2 所有元素
刚才我们使用bs.li只能获取第一个li元素,剩下的三个没有取到,这时可以使用bs对象的find_all方法
bs.find_all("li") #返回所有的li对象
我们可以遍历所有的li对象,获取其文本内容
li=bs.find_all("li")
for i in li:
print(i.text)
findall方法还可以获取指定class的元素,比如我们只取class='c1’的li对象
li=bs.find_all("li",class_="c1")
for i in li:
print(i.text)
获取某个标签下面的所有元素
bs.ul.find_all('li')
1.3 属性值
现在我们来获取a标签的所有href属性和class属性,使用attrs
bs.a.attrs['href'] #获取a标签的href属性值
bs.a.attrs['class'] #获取a标签的class属性值
获取所有a标签的href值
href=[]
li=bs.find_all("a")
for i in li:
href.append(i.attrs['href'])
1.4 标签名称
使用name,可以获取元素的标签名
bs.head.name
1.5 父子兄弟
使用parent,获取上一级元素,ul的上一级是body,a的上一级是ul
bs.ul.parent
bs.a.parent
使用children,获取下一级元素,body的下一级元素是ul,还有很多None,我也没找到好办法搞定None值,只能使用的时候过滤一下。
for i in bs.body.children:
print(i.name)
使用previous_sibling和next_sibling获取兄弟
bs.a.previous_sibling
bs.a.next_sibling