赞
踩
BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
#导入库:
from bs4 import BeautifulSoup
#创建实例:
file = open("./bs4test.html","rb")
#创建对象
html = file.read()
#使用Python标准库进行解析
bs = BeautifulSoup(html,"html.parser")
3.2.1 简介
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:
3.2.2 tag
获得标签及其内容,默认拿到它所找的第一个标签的内容
#获取title标签的所有内容
print(bs.title)
#获取第一个a标签的所有内容
print(bs.a)
#获取head标签的所有内容
#print(bs.head)
#查看类型
print(type(bs.a))
tag两个重要的属性,name和attrs
# [document] #bs 对象本身比较特殊,它的 name 即为 [document] print(bs.name) # head #对于其他内部标签,输出的值便为标签本身的名称 print(bs.head.name) # 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。 print(bs.a.attrs) #还可以利用get方法,传入属性的名称,二者是等价的 print(bs.a['class']) # 等价 bs.a.get('class') # 可以对这些属性和内容等等进行修改 bs.a['class'] = "newClass" print(bs.a) # 还可以对这个属性进行删除 del bs.a['class'] print(bs.a)
3.2.3 NavigableString
获得标签里的内容(字符串),使用.string的方式就可以了
# #只要标签里面的内容
print(type(bs.title.string))
3.2.4 BeautifulSoup
获取整个文档内容
print(bs.name)
print(bs.attrs)
#获取整个文档内容
print(bs)
3.2.5 Comment
是一个特殊的NavigableString,输出内容不包含注释符号
#这种方式不会出现注释符
print(bs.a.string)
#查看类型
print(type(bs.a.string))
4.1 contents
获取Tag的所有子节点,返回一个list
#tag的.content 属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
#用列表索引来获取它的某一个元素
print(bs.head.contents[1 ])
4.2 children
获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
其他:
descendants:获取Tag的所有子孙节点
5.4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
5.5、.stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容
5.6、.parent:获取Tag的父节点
5.7、.parents:递归得到父辈元素的所有节点,返回一个生成器
5.8、.previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
5.9、.next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
5.10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器
5.11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器
5.12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的
5.13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的
5.14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容
5.15、.next_elements:返回一个生成器,可以向后访问文档的解析内容
5.16、.has_attr:判断Tag是否包含属性
5.1 find_all()
字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all("a")
print(t_list)
5.1.1 正则表达
使用search()方法来匹配内容,寻找标签种有a,把内容显示出来
import re
t_list= bs.find_all(re.compile("a"))
print(t_list)
5.1.2 引入自定义函数
def name_is_exists(tag):
return tag.has_attr("class")
t_list = bs.find_all(name_is_exists)
for item in t_list: #列表打印
print(item)
5.2 kwargs参数
#寻找id=head
t_list = bs.find_all(id="head")
#寻找id=link1
t_list = bs.find_all(id="link1 ")
#查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
t_list = bs.find_all(class_=True)
for item in t_list:
print(item)
#查询href属性包含http://example.com/elsie的Tag
t_list = bs.find_all(href="http://example.com/elsie")
print(t_list)
5.3 text 参数
通过text参数可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受 字符串,正则表达式,列表
t_list= bs.find_all(text = "Tillie")
t_list = bs.find(text=["Tillie","Lacie"])
#应用正则表达式来查找包含特定文本的内容(标签里的字符串)
t_list = bs.find_all(text=re.compile("\d"))
for item in t_list:
print(item)
5.4 limit 参数
可以传入一个limit参数来限制返回的数量,与sql语句中的类似
#限制返回数量limit
t_list = bs.find_all("a",limit=2)
for item in t_list:
print(item)
5.5 find()
find()将返回符合条件的第一个Tag,有时我们只需要或一个Tag时,我们就可以用到find()方法了。当然了,也可以使用find_all()方法,传入一个limit=1,然后再取出第一个值也是可以的,不过未免繁琐。
from bs4 import BeautifulSoup import re file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html, "html.parser") # 返回只有一个结果的列表 t_list = bs.find_all("title",limit=1) print(t_list) # 返回唯一值 t = bs.find("title") print(t) # 如果没有找到,则返回None t = bs.find("abc") print(t)
从结果可以看出find_all,尽管传入了limit=1,但是返回值仍然为一个列表,当我们只需要取一个值时,远不如find方法方便。但
是如果未搜索到值时,将返回一个None
BeautifulSoup支持发部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag:
6.1、通过标签名查找 print(bs.select('title')) print(bs.select('a')) 6.2、通过类名查找 print(bs.select('.mnav')) 6.3、通过id查找 print(bs.select('#u1')) 6.4、组合查找 print(bs.select('div .bri')) 6.5、属性查找 print(bs.select('a[class="bri"]')) print(bs.select('a[href="http://tieba.baidu.com"]')) 6.6、直接子标签查找 t_list = bs.select("head > title") print(t_list) 6.7、兄弟节点标签查找 t_list = bs.select(".mnav ~ .bri") print(t_list) 6.8、获取内容 t_list = bs.select("title") print(bs.select('title')[0].get_text())
测试html代码:
<!DOCTYPE html> <html> <head> <meta content="text/html;charset=utf-8" http-equiv="content-type" /> <meta content="IE=Edge" http-equiv="X-UA-Compatible" /> <meta content="always" name="referrer" /> <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css" /> <title>百度一下,你就知道 </title> </head> <body link="#0000cc"> <div id="wrapper"> <div id="head"> <div class="head_wrapper"> <div id="u1"> <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a> <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a> <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a> <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a> <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a> <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a> <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品 </a> </div> </div> </div> </div> </body> </html>
参考连接:http://www.jsphp.net/python/show-24-214-1.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。