bs4解析库
beautifulsoup4
bs4解析库是灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页的提取
要解析的html标签
from bs4 import BeautifulSoup # 要解析的html标签 html_str = """ <li data_group="server" class="content"> <a href="/commands.html" class="index" name="a1">第一个a标签 <a href="/commands.html" class="index2" name="a2">第二个a标签 <a href="/commands/flushdb.html"> <span class="first"> 这是第一个span标签 <span class="second"> 这是第二个span标签,第一个下的子span标签 </span> </span> <span class="third">这是第三个span标签</span> <h3>这是一个h3</h3> </a> </li> """
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
1. 找标签:
# 1. find_all 找到所有的li标签 结果为一个结果集 li_find_all = BeautifulSoup(html_str, "lxml").find_all("li") print(type(li_find_all)) # <class 'bs4.element.ResultSet'> # 2. find 找到第一个li标签 结果为一个标签对象 li_find = BeautifulSoup(html_str, "lxml").find("li") print(type(li_find)) # <class 'bs4.element.Tag'> # 添加限制条件 class id li = BeautifulSoup(html_str, "lxml").find_all("li", class_="content", data_group="server") li1 = BeautifulSoup(html_str, "lxml").find_all("li", attrs={"class":"content", "data_group":"server"})
2. 找标签属性和name:
# 找到a标签的属性和name a = BeautifulSoup(html_str, "lxml").find("a") print(a.get("href"), a.name, type(a.get("href"))) # /commands.html a <class 'str'> print(a.attrs, type(a.attrs), a.text, a.string, type(a.string)) # {'href': '/commands.html', 'class': ['index'], 'name': 'a1'} <class 'dict'> 第一个a标签 <class 'bs4.element.NavigableString'>
3. 处理子标签和后代标签:
# 找到li下的后代标签 li_find = BeautifulSoup(html_str, "lxml").find("li") print(li_find.children) # <list_iterator object at 0x00000132C0915320> """ for i in li_find.children: print(type(i),i) """ # 找到li下的子标签 返回第一个找到的标签 print(li_find.a, type(li_find.a)) # <a class="index" href="/commands.html" name="a1">第一个a标签</a> <class 'bs4.element.Tag'>
4. 处理兄弟标签:
# 处理a标签的兄弟 a = BeautifulSoup(html_str, "lxml").find("a", class_="index2") print(a.next_siblings, type(a.next_siblings)) # <generator object next_siblings at 0x000001B14AA712B0> <class 'generator'> """ for i in a.next_siblings: print(i, type(i), "\n") 1. <a class="index" href="/commands.html" name="a1">第一个a标签 </a> <class 'bs4.element.Tag'> 2. <a href="/commands/flushdb.html"> <span class="first"> 这是第一个span标签 <span class="second"> 这是第二个span标签,第一个下的子span标签 </span> </span> <span class="third">这是第三个span标签</span> <h3>这是一个h3</h3> </a> <class 'bs4.element.Tag'> """ # print("next--", a.last ,type(a.next)) # 一组兄弟标签中的下一个标签next_sibling() 下的所有标签next_siblings() # 一组兄弟标签中的上一个标签previous_sibling() 上的所有标签previous_siblings() # 找到一组兄弟标签下的最后一个标签: a = [x for x in a.next_siblings][-1] print("aaaaaa", a, type(a))
5. 处理父标签:
# 1.parent # 返回的父标签及其子标签 span = BeautifulSoup(html_str, "lxml").find("span", class_="second") print(span.parent, type(span.parent)) # 2. parents 一层一层返回 """ span = BeautifulSoup(html_str, "lxml").find("span", class_="second") for i in span.parents: print(i) """
6. 标签的其它一些处理方法
# 1. prettify方法 # 这个方法就是在每个标签后加入一个\n 打印出来是十分规范的h5代码 一目了然 # 也可以对某个标签做格式化处理 a = BeautifulSoup(html_str, "lxml").find("a") print(a.prettify()) # 2.contents方法 li = BeautifulSoup(html_str, "lxml") print(li.contents, type(li.contents)) print(li.childrent, type(li.children)) """ li_find.contents 返回的是一个列表 查找的标签下的子标签 包括'\n' li_find.children 返回的是一个迭代器, 迭代器的内容与li_find.contents一样 """

更多精彩