#BeautfiulSoup是Python支持的一个第三方库,它的主要作用是可以非常方便的从HTML网页中提取所需要的数据 #lxml是第三方的解析库,默认情况下BS4会使用Python自带的解析器取解析html页面,但是lxml解析速度更快,功能上更为强大,因为它的底层是通过c语言实现的。 from bs4 import BeautifulSoup import re #创建一个BeautifulSoup对象 bs=BeautifulSoup(open("index.html",encoding="utf-8"),"lxml") #BeautifulSoup()类,它是将一个HTML文档,转换成一个复杂的,有层次的树形结构,从而形成父节点和子节点之间的关系,每一个节点对应一个Python对象。 #树形结构中的Python对象类型: #BeautifulSoup:一般指代的是整个html文档内容 #Tag:指代的就是html文档中的一个标签,有两个重要的树形,name,attrs #NavigableString:指代的是就是标签中的文字 #Comment:这个对象是一个特殊的NavigableString对象,其输出的内容是注释但是不包含注释符号 # print(bs) # print(type(bs))#BeautifulSoup #------------------------------选择元素----------------------------------- # #获取html文档中title标签的内容 # print(bs.title) # print(type(bs.title))#Tag # # #获取html文档中a标签的内容(会匹配第一个符合要求的a标签) # print(bs.a) # print(type(bs.a))#Tag # #获取html文档中的div标签的内容 # print(bs.div) # print(type(bs.div))#Tag # #获取html文档中div下面的a标签的内容 # print(bs.div.a) #-------------------提取信息(标签名称,属性值,文本)----------------------------- #获取标签的名称,name属性是在获取当前标签的名称 # print(bs.head.name) # print(bs.title.name) # #获取某一个标签内部的属性值attrs # print(bs.a.attrs) # #只获取某个标签的其中一个属性值 # print(bs.a["href"]) # print(bs.a.get("id")) # #获取标签的文本内容,string:获取某个标签的文本内容的时候,如果这个标签里面没有标签了,则.stirng获取的就是该标签的文本内容,如果该标签内容中还抱歉其他标签则返回None # print(bs.title.string) # print(type(bs.title.string))#NavigableString # print(bs.div.string) # print(bs.p.string) # print(type(bs.p.string))#Comment #------------------------文档树节点的选择-------------------------------------------------- #1>contents属性:遍历某一个父节点的直接子节点,可以将Tag类型的直接子节点以列表的方式进行输出,但是直接子节点内部的子节点是无法单独获取的。 # print(bs.body.contents) # #直接从子节点列表中获取某一个节点 # print(bs.body.contents[1]) # #2.>children属性,返回的是一个生成器对象,可以将Tag类型的直接子节点以生成器的方式进行输出,但是直接子节点的内部的子节点无法单独获取到。 # print(bs.body.children) # for i,child in enumerate(bs.body.children): # print(i,child) #3.>descendants属性:获取所有的子孙节点(即包含直接子节点,又包含子节点的子节点),结果也是一个生成器对象 # print(bs.body.descendants) # for i,child in enumerate(bs.body.descendants): # print(i,child) #4.>parent属性:获取父节点以及父节点包含的所有内容 # print(bs.title.parent) #5.>next_sibling属性:获取当前节点的下一个兄弟节点,如果没有下一个兄弟节点,则返回None #实际文档中的tag的.next_sibiling和.previous_sibling属性通常是字符串或者空白,因为空白或者换行也可以被视作为一个节点,所以得到的结果可能是空白或者换行 # print("===",bs.meta.next_sibling) # print("===",bs.meta.next_sibling.next_sibling) # # #6.>previous_sibling属性,获取当前节点的上一个兄弟节点,如果没有则返回None # print("----",bs.title.previous_sibling) # print("----",bs.title.previous_sibling.previous_sibling) #-----------------通过find_all 和find进行文档树内容的搜索------------------------------------ #1>find_all()用于搜索当前节点的所有子节点,返回值是一个列表 #name,attrs recursive, text,limit result_list=bs.find_all('a') print(result_list) result_list_1=bs.find_all(attrs={"class":"second"}) print(result_list_1) result_list_3=bs.find_all(attrs={"id":"one"}) print(result_list_3) #使用find_all()方法时,BeautifulSoup会检索当前标签的所有子孙节点,如果只想搜索标签的直接子节点,可以将recursive设置为False,limit可以对查找到的节点个数进行限制 result_list_4=bs.body.find_all(recursive=False,limit=2) print(result_list_4) result_list_5=bs.find_all(text="腾讯") print(result_list_5) result_list_6=bs.find_all(id="one") print(result_list_6) #由于class是Python的系统关键字,表示类。所以使用find_all来通过class属性值来匹配内容的时候,需要将class变为class_ result_list_7=bs.find_all(class_="second") print(result_list_7) result_list_8=bs.find_all(id=re.compile("two")) print(result_list_8) #find()和findall用法一致,只不过finall返回的是一个列表,find返回的是第一个符合条件的内容。 ''' (3)find_parents() find_parent() find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等. find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容 (4)find_next_siblings() find_next_sibling() 这2个方法通过 .next_siblings 属性对当 tag 的所有后面解析的兄弟 tag 节点进行迭代, find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点 (5)find_previous_siblings() find_previous_sibling() 这2个方法通过 .previous_siblings 属性对当前 tag 的前面解析的兄弟 tag 节点进行迭代, find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点, find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点 (6)find_all_next() find_next() 这2个方法通过 .next_elements 属性对当前 tag 的之后的 tag 和字符串进行迭代, find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点 (7)find_all_previous() 和 find_previous() 这2个方法通过 .previous_elements 属性对当前节点前面的 tag 和字符串进行迭代, find_all_previous() 方法返回所有符合条件的节点, find_previous()方法返回第一个符合条件的节点 ''' #-----------------通过css选择器进行文档树内容的搜索------------------------------------ #1.通过标签名来搜索一个标签 print(bs.select("title")) print(bs.select("a")) #2.通过class属性值搜索一个标签 #.是用来匹配一个属性值得固定用法 print(bs.select(".second")) #3.通过id这个属性值来搜索一个标签 # #号是匹配id值得固定用法 print(bs.select("#two")) #4.组合查找 print(bs.select("div #two")) print(bs.select("div .second"))
BeautifulSoup的基本使用
猜你喜欢
转载自www.cnblogs.com/chensang/p/10097407.html
今日推荐
周排行