besutifulSoup是一种解析器。返回的是beautifulsoup类型的。
安装:pip install beautifulsoup4
引入:from bs4 import BeautifulSoup
初始化:Bs=beautifulSoup(html,‘html.parse’),python默认解析器,也可‘lxml’(更快,需安装
(安装lxml:pip install lxml)
格式化输出:print bs.prettify() 输出的是html代码
选择器:
1.标签选择器(p,a,head,title,ul,li……)
Bs=beautifulSoup(html,‘html.parse’),python默认解析器
bs.a :整个a标签的html代码
Bs.a.string :a标签的全部内容,有注释的话,会自动去掉注释符号,留下注释文本
Bs.a.contents: a标签的全部内容,tag 的 .content 属性可以将tag的子节点以列表的方式输出,可用列表索引来获取它的某一个元素
Bs.a.children:a标签的所有子节点,它返回的不是一个 list,不过我们可以通过遍历获取所有子节点
Bs.a.get_text(): 忽略注释的内容
bs.a.name:a标签的名字:a
bs.a.attrs :a标签所有属性
bs.a['class']
bs.a.get('class') 可修改:bs.a.get('class')=‘newclass’,可删除:del bs.a['class']
2.find_all,find
重点介绍下find_all()方法:
find_all( name , attrs , recursive , text , **kwargs )
- 1
(1)name参数
name参数可以查找所有名字为name的Tag,字符串对象自动忽略掉。
print bs.find_all('a')
- 1
传列表:
print bs.find_all(['a','b'])
- 1
传入正则表达式:
print bs.find_all(re.compile('^b'))
- 1
所有以b开头的标签对象都会被找到。
传递方法:
def has_class_but_not_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
print bs.find_all(has_class_but_not_id)
(2)kwyowrds关键字
print bs.find_all(id='css')
print bs.find_all(id=re.compile('^a'))
还可以混合使用:
print bs.find_all(id='css',href=re.compile('^ex'))
- 1
可以使用class作为过滤,但是class是Python中的关键字,可以使用class_代替,或者采用字典的形式传输参数:
print bs.find_all(class_='css')
print bs.find_all(attrs={'class':'css'})
(3)text参数
用来搜索文档中的字符串内容,text参数也接收字符串、正则表达式、列表、True等参数。
print bs.find_all(text=re.compile('^abc'))
- 1
(4)limit参数
限制返回对象的个数,与数据库SQL查询类似。
(5)recursive参数
调用tag的find_all()方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。
3. CSS选择器
可以采用CSS的语法格式来筛选元素:
#标签选择器
print bs.select('a')
#类名选择器
print bs.select('.css')
#id选择器
print bs.select('#css')
#属性选择器
print bs.select('a[class="css"]')
#遍历
for tag in bs.select('a'):
print tag.get_text()