1. 简介
简单来说,Beautiful Soup是Python的一个HTML或XML的解析库,用它可以方便的从网页中提取数据。
Beautiful Soup解析时实际上依靠解析器,支持的解析器如下:
解析器 | 使用方法 |
---|---|
Python标准库 | BeautifulSoup(markup,“html.parser”) |
lxml HTML解析库 | BeautifulSoup(markup,“lxml”) |
lxml XML解析库 | BeautifulSoup(markup,“xml”) |
html5lib | BeautifulSoup(markup,“html5lib”) |
2. 使用方法
2.1 结点选择器(功能较弱但速度快)
1.选择元素:注意,当有多个结点匹配时,只选择第一个。
<ul>
<li class="item-0 item-1"><a href="0.html">item 0 </a></li>
<li class="item-1"><a href="1.html">item 1 </a></li>
</ul>
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxml")
print(soup.ul.li) #type: bs4.element.Tag
#关联选择:直接子节点
print(soup.ul.contents) #type: list,既包含文本又包含节点
print(soup.ul.children) #type: list_iterator
for child in soup.ul.children: #type_child:文本部分为bs4.element.NavigableString
print(child) #节点部分为bs4.element.Tag
#关联选择:所有子孙结点
print(soup.ul.descendants) #type:generator
for i,child in enumerate(soup.ul.descendants):
print(i,child) #type_child同上
#关联选择:父节点,祖先节点
print(soup.a.parent)
print(list(soul.a.parents))
#关联选择:兄弟节点(同级节点)
print(soup.li.next_sibling) #type:bs4.element.Tag
print(list(enumerate(soup.li.next_siblings)))
print(soup.li.previous_sibling)
print(list(enumerate(soup.li.previous_siblings)))
2.2 提取信息
#获取名称
print(soup.title.name) #type: str
#获取属性
print(soup.li.attrs) #type: dict
print(soup.li.attrs["class"]) #type: list
print(soup.ul["class"]) #type: list
print(list(soup.a.parents)[0]["class"])#结果与上一个相同
#获取内容
print(soup.title.string)
2.3 方法选择器
查询方法 | 结果 |
---|---|
find_all() | 查找所有符合条件的元素 |
find() | find_all()第一个匹配的元素 |
find_parent() | 返回直接父节点 |
find_parents() | 返回祖先节点 |
find_next_sibling() | 返回后面第一个兄弟节点 |
find_next_siblings() | 返回后面所有兄弟节点 |
find_previous_sibling() | 返回前面第一个兄弟节点 |
find_previous_siblings() | 返回前面所有兄弟节点 |
find_next() | 返回第一个符合条件的结点 |
find_all_next() | 返回后面所有符合条件的结点 |
find_previous()、find_all_previous() | … |
<ul>
<li class="item-0"><a href="0.html">item 0 </a>hello
</li>
</ul>
方法示例:
#find_all(name,attrs,recursive,text,**kwargs)
#name:
print(soup.find_all(name='li')) #type:list
print(soup.find_all(name='li')[0]) #type:bs4.element.Tag
#attrs:传入字典
print(soup.find_all(attrs={'class':'item-0'}))#type同上
#text:匹配节点的文本,传入可以使字符串,也可以是正则表达式对象
print(soup.find_all(text=re.compile('hello'))#['hello\n '],返回有文本组成的list