【BOOK】解析库--Beautiful Soup
1、安装bs4库
2、解析器
3、节点选择器
from bs4 import BeautifulSoup html = ''' <html> <head><title>这是标题</title></head> <body> <p class="title" name="dromouse"><b>这是标题</b></p> <p class="story" >从前有座山 <a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a> <a href="http://www.baidu.com/2" class="sister" id="link2">链接2</a> <a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a> 完了</p> </body></html> ''' soup = BeautifulSoup(html, 'lxml') ## prettify()把要解析的字符串以标准的缩进格式输出 print(soup.prettify()) ## 获取head节点 print(soup.head) # <head><title>这是标题</title></head> ## 获取p节点,返回第一个p节点 print(soup.p) ## 获取节点名称--name print(soup.title.name) # title ## 获取节点属性--attrs print(soup.p.attrs) # {'class': ['title'], 'name': 'dromouse'} print(soup.p.attrs['class']) # ['title'] ## 简写 print(soup.p['class']) # ['title'],返回列表,因为class属性可以有多个值 print(soup.p['name']) #dromouse,返回字符串,因为name属性只能有一个值 ## 获取节点的文本 print(soup.p.string) # 这是标题 ## 嵌套选择 print(soup.head.title) # <title>这是标题</title>
from bs4 import BeautifulSoup html = ''' <html> <head><title>这是标题</title></head> <body> <p class="story" >从前有座山 <a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a> <a href="http://www.baidu.com/2" class="sister" id="link2"><span>链接2</span></a> <a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a> 完了</p> </body></html> ''' soup = BeautifulSoup(html, 'lxml') ## 关联选择 ## 子节点 & 子孙节点 ## contents属性,返回列表,包含p节点的每一个子节点 print(soup.p.contents) ## children属性,返回所有子节点,生成器类型,用for循环输出 print(soup.p.children) ## <list_iterator object at 0x0353BF10> for child in enumerate(soup.p.children): print(child) ## 7个元素,包括 \n ## descendants属性,返回所有子孙节点,生成器类型,用for循环输出 print(soup.p.descendants) ## <generator object Tag.descendants at 0x03915330> for child in enumerate(soup.p.descendants): print(child) # 父节点 & 祖先节点 # parent属性,返回a节点的直接父节点 p print(soup.a.parent) ## parents属性,返回所有祖先节点,生成器类型 print(list(enumerate(soup.a.parents))) ## 兄弟节点 print('下一个兄弟', soup.a.next_sibling) print('上一个兄弟', soup.a.previous_sibling) print('所有前面的兄弟', list(enumerate(soup.a.next_siblings))) print('所有后面的兄弟', list(enumerate(soup.a.previous_siblings)))
4、方法选择器
(1)find_all(name, attrs, recursive, text, **kwgrgs)
返回所有匹配结果,列表类型
html = ''' <div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">BBB</li> <li class="element">BBB CCC</li> <li class="element">GGG</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">HHH</li> <li class="element">YYY</li> <li class="element">VVV</li> </ul> </div> </div> ''' from bs4 import BeautifulSoup import re soup = BeautifulSoup(html,'lxml') # name—根据节点名查询,返回列表,每个元素类型为Tag类型 print(soup.find_all(name='ul')) for ul in soup.find_all(name='ul'): for li in ul.find_all(name='li'): print(li.string) # attrs--属性查询,参数类型是字典类型,返回列表类型 print(soup.find_all(attrs={'class':'element'})) ## id,class属性为常用属性,可以不用字典形式 print(soup.find_all(class_='element')) print(soup.find_all(id='list-1')) # text--匹配节点的文本,传入参数可以是字符串或者正则表达式 print(soup.find_all(text='BBB')) print(soup.find_all(text=re.compile('BBB'))) # ['BBB', 'BBB CCC']
(2) find() 返回第一个匹配结果,Tag类型
(3) find_parents() 返回所有祖先节点
find_parent() 返回父亲节点
(4) find_next_siblings() 返回所有后面的兄弟节点
find_next_sibling() 返回第一个后面的兄弟节点
(5) find_previous_siblings() 返回所有前面的兄弟节点
find_ previous _sibling() 返回第一个前面的兄弟节点
(6) find_all_next () 返回所有后面的节点
find_next () 返回第一个后面的节点
(7) find_all_previous () 返回所有前面的节点
find_ previous () 返回第一个前面的节点
5、CSS选择器
select()
html = ''' <div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">BBB</li> <li class="element">BBB CCC</li> <li class="element">GGG</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">HHH</li> <li class="element">YYY</li> <li class="element">VVV</li> </ul> </div> </div> ''' from bs4 import BeautifulSoup import re soup = BeautifulSoup(html,'lxml') print(soup.select('.panel-heading')) ## class属性值为 panel-heading print(soup.select('li')) ## 返回列表类型,列表元素为Tag类型 print(soup.select('#list-2 .element')) ## 嵌套选择 for ul in soup.select('ul'): print(ul.select('li')) ## 获取属性 for ul in soup.select('ul'): print(ul['id']) ## 或者 print(ul.attrs['id']) ## 获取文本 get_text() for li in soup.select('li'): print('获得文本:', li.get_text()) print('或者:', li.string)