1.BeautifulSoup是强大的库,它包含在一个名称为bs4的文件包中,需要另外安装,安装很简单,在命令行窗体中进入python的安装目录,在进入Scripts子目录.找到pip程序,执行:
pip install bs4
安装成功后在python的命令窗口中执行语句:
from bs4 import BeautifulSoup
没报错安装成功.
HTML缺失根元素是BeautifulSoup会自动补上,他发现
2.BeautifuSoup查找文档元素.
查找元素是我们爬取网页信息的重要手段,BeautifulSoup提供了一系列的查找元素的方法,其中功能强大的find_all函数就是其中常用的一个方法.
find_all函数的原型如下:
**find_all(self,name=None,attrs={},recursive=True,text=None,limit=None,kwargs)
self 表明它是一个类成员函数;
name 是要查找tag元素名称,默认值None,如果不提供,就是查找所有元素.
attrs是元素的属性,它是一个字典,默认是空.如果提供就是查找有这个指定属性的元素.
recursive指定查找是否在元素节点的子树下面全范围进行,默认True;
find_all函数返回查找到的所有指定的元素的列表,每个元素是一个bs4.element.Tag对象.
如果我们只查找一个元素节点,那么可以使用find函数,它的原型如下:
**find(self,name=None,attrs={},recursive=True,text=None,limit=None,kwargs)
他与find_all类似,不同的是它只返回第一个满足要求的节点,不是一个列表.
3.BeautifulSoup获取元素属性值
如果一个元素已经找到,例如找到元素,那怎么获取它的属性值呢?BeautifulSoup使用tag[attrName]
来获取tag元素的名称为attrName的属性值,其中tag是一个bs4.element.Tag对象.
4.BeautifulSoup获取元素包含的文本值
找到一个元素,例如找到元素,那么怎么获取包含文本的文本值呢?
BeautifulSoup使用:tag.text来获取tag元素包含的文本值,其中tag是一个bs4.element.Tag对象.
以下面这个html为例子.
import lxml
from bs4 import BeautifulSoup
doc = '''
<html>
<head><title>my sister is a Beautiful girl</title></head>
<body>
<p class='title'><b>The is my pen</b></p>
<p class='story'>The is my friends;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/title" class="sister" id='link3'>title</a>
and live happy
</p>
<p class="story">...</p>
</body>
</html>
'''
soup=BeautifulSoup(doc,"lxml")
tags=soup.find_all(name=None,attrs={"class":"story"})
for tag in tags:
print(tag)
查看文本
soup=BeautifulSoup(doc,"lxml")
tags=soup.find("p",attrs={"class":"story"})
print(tags.text)
查看html的文本
5.BeautifulSoup高级查找.
不是find和find_all都能满足我们需要,那么我们可以设计一个查找函数.
tag参数,实际上就是每个元素.
程序我们定义一个筛选函数myFilter(tag),它的参数是tag对象,在调用soup.find.all(myFilter)是程序会把每个tag元素传递给myFilter函数,由该函数觉得这个tag的取舍,如果函数返回True就保留这个tag到结果集中,不然就丢掉这个tag.
tag.name是tag名的称
tag.hash_attr(attName)判断tag是否有attName属性;
tag[attName]是tag的attName属性值;
6.BeautifulSoup查找变量相关元素(邻近节点 上节点 …)
获取元素节点的父节点
BeautifulSoup通过
tag.parent
正个文档的父节点,直到找不到为止.
获取元素节点的直接子元素节点
BeautifulSoup通过
tag.children
获取所有元素节点的所有子孙元素节点
BeautifulSoup通过
tag.desendants
获取tag节点的所有子孙节点元素,包括element、text等类型的节点.
获取元素的兄弟节点
tag.next_sibling
tag.previous_sibling
来获取下一个和前一个兄弟节点,其中tag.next_sibling是tag的临近的下一个兄弟节点,tag.previous_sibling是tag临近前一个兄弟节点.
import lxml
from bs4 import BeautifulSoup
doc = '''
<html>
<head><title>my sister is a Beautiful girl</title>
</head>
<body>
<p class='title'><b>The<i> is my pen</i></b> once upon a time...
</p>
<p class='story'>The is my friends;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/title" class="sister" id='link3'>title</a>
and live happy
</p>
<p class="story">...</p>
</body>
</html>
'''
soup=BeautifulSoup(doc,"lxml")
tag=soup.find("b")
print(tag.previous_sibling)
print(tag.next_sibling)
tag=soup.find("i")
print(tag.previous_sibling)
print(tag.next_sibling)
我们来查看父节点的名称
查看子节点的名称
BeautifulSoup支持find和find_all自己函数,也支持css语法查询.
7.BeautifulSoup处理可以用find与find_all函数查找HTML文档树的节点元素外,还可以采用css类似语法查询,规则是:
tag.select(css)
其中tag是一个bs4.element.Tag对象,即HTML中的一个element节点元素,select是它查找方法,css是类似css语法的一个字符串,一般结构如下:
[tagName][attName[=value]]
其中[…]部分是可选的;
tagName是元素名称,如果没指定就是所有元素;
attName=value是属性名称,value是它对应的值,可以不指定属性,在指定了属性后也可以不指定值;
tag.select(css)返回一个bs4.element.Tag的列表,哪怕只有一个元素也返回一个列表.
soup.select(“a”)查找文档中所有元素节点;
soup.select(“p a”)查找文档所有
节点下所有的元素节点;
soup.select(“a[id=‘link1’]”)查找属性id='link1’的节点
…
select查找兄弟节点
soup.select(“div ~p”)查找到同级别的p节点
from bs4 import BeautifulSoup
doc='''
<body>
demo
<div>A</div>
<p>X</p>
<p>B</p>
<span><p>C</p></span>
</body>'''
soup=BeautifulSoup(doc,"lxml")
print(soup.prettify())
tags=soup.select("div ~ p")
print(len(tags))
for tag in tags:
print(tag)
print()
tags=soup.select("div+p")
for tag in tags:
print(tag)
运行代码