#coding:utf-8 #__author__='wang' #Beauyiful Soup 是Python支持的第三方库,主要作用是可以非常方便的从HTML网页中 提取所需的数据 #lxml第三方的解析库,默认情况下BS4会使用Python自带的解析库去解析HTML网页,但是 lxml解析器速度更快功能更强大,因为它的底层是通过C语言实现的 from bs4 import BeautifulSoup import bs4 #创建bs对象,可以根据一段网页字符串创建,也可以根据一个.HTML的文件创建 html = """ <html> <body> <a href='http://www.baidu.com'>百度一下</a> </body> </html> """ #bs = BeautifulSoup(html) bs = BeautifulSoup(open('index.html'),'lxml') # print type(bs) # print bs.prettify() #获取html文档中的title标签内容 # print bs.title # print'=====' #获取html文档中的head标签内容 # print bs.head # print '-----' # print bs.a # print'=====' # print bs.div # print '-----' #name属性是在获取当前标签的名称。由于bs对象本身并不是一个HTML标签所以便不是获取 标签名,而是获取一个bs所代表的的值[document],对于标签来说是获取标签名 # print bs.name # print '=====' # print bs.head.name #.attrs:获取开始标签内部的属性值 #<>:开始标签,</>:结束标签 # print bs.html.attrs # print bs.a.attrs #只获取标签中的一个属性 #标签中的class属性值可以设置多个获取class属性值的时候获取的是一个列表 # print bs.a['href'] # print bs.a['class'] #删除标签的属性 # del bs.a['id'] # print '删除之后的a标签属性:',bs.a.attrs # print '**********' #BeautifulSoup()类,它是将HTML文档,转换成一个复杂的、有层次的树形结构,从而形成 了父节点和子节点,每一个节点对应的是一个Python对象 #标签的内容:class 'bs4.element.NavigableString' # print bs.a.string # print type(bs.a.string) # print '************' #bs对象:<class 'bs4.BeautifulSoup'> #<class 'bs4.element.Tag'> # print type(bs.title),bs.title # print '************' #树形结构中的Python对象类型 #Tag:指的就是HTML中的一个标签(既包含开始标签和结束标签,也包含标签中的所有内容), 两个重要属性:name,attrs #NavigableString:指的是标签中的内容(不包含标签) # print bs.div.string #BeautifulSoup:一般指代的是整个HTML的内容 #Comment:该对象是一个特殊类型到的NavigableSrting对象,表示获取的文档内容中不 包括注释内容的对象 # print bs.title.string,type(bs.title.string) # print '^^^^^^^' #遍历文档树 #1.遍历某一个父节点的直接子节点 #contents属性,可以将Tag类型的直接子节点以列表的形式进行输出,但是直接子节点内部 的子节点是无法进行获取的 # print bs.head.contents # print bs.body.contents #[<meta>,<title></title>] #[<a></a>,<div><a></a>,<a></a>,<a></a></div>] #从直接子节点列表中获取某一个标签节点 # res = bs.head.contents[3] # print type(res),res #2.children属性:获取的是一个list生成器对象,也可以成为迭代器对象 # res = bs.head.children # print type(res),res # for child in res: # print child #3.descendants属性:获取所有节点的子孙节点(既包含直接子节点又包含直接子节点的 子节点),结果是一个生成器对象 # res = bs.body.descendants # print type(res),res # for tag in res: # print tag # print "%%%%%%%%%%%%%%" #4.string属性:获取标签的节点内容,如果一个标签内部没有其他标签了,那么string 返回该标签内部的文字内容,如果一个标签内部还包含多个其他的标签那么string返回None #5.parent属性:获取父节点的属性 # head = bs.title.parent # print type(head) # print head.name # print '-------------' #6.next_sibling属性:获取当前节点的下一个兄弟节点,如果没有下一个兄弟节点返回None # title = bs.meta.next_sibling # print title #7.previous_sibling属性:获取当前节点的上一个兄弟节点,如果没有返回None # meta = bs.title.previous_sibling # print meta #关于文档内容的搜索 #1.find_all():用于搜索当前标签的所有子节点 # res = bs.find_all('a') # for tag in res: # print tag res = bs.find_all(['a','title']) for tag in res: print tag #通过标签的属性搜索标签 #id属性的值是唯一的,class属性的值是可以重复的所以用find_all获取的是一个列表 print bs.find(id = 'one') #class在Python中是关键字,表示类。所以在表示HTML中的class属性时需要使用class_ print bs.find_all(class_= 'second') print "______________" #2.通过CSS选择器进行标签的查找 #1.通过标签名查找 print bs.select('title') print bs.select('a') print "--------------------" #2.通过class属性值查找 print bs.select('.first') print bs.select('.second') print "===================" #3.通过id属性查找 # 井号#是匹配id值的固定用法 print bs.select('#one') #利用上述方式进行组合查找 print bs.select('div #two') #查找div标签内部class属性值是second的标签 print bs.select('div .second')
bs4_lxml
最新推荐文章于 2022-05-15 17:01:40 发布