## python爬虫-BeautifulSoup库
python爬虫抛开其它,主要依赖两类库:HTTP请求、网页解析;这里requests可以作为网页请求的关键库,BeautifulSoup库则是网页内容解析的关键库;爬虫架构分为五部分:调度器、URL管理器、网页下载器、网页解析器、应用程序等。
requests库是通过封装urllib库的一个HTTP请求库,可以实现urllib绝大部分的功能且使用性高。BeautifulSoup库是第三方库,用来提取xml/html中的数据。
``` python3 #! python3
import requests from bs4 import BeautifulSoup
responses = requests.get("https://www.baidu.com") responses.encoding = "utf-8" # bs解析对象 soup = BeautifulSoup(responses.text,"html.parser",from_encoding="utf-8") # 获取所有a标签内容 links = soup.find_all('a') for link in links: print(link.name,link['href'],link.get_text()) ```
**解析器**
bs4使用时需要指定一个解析器:
- html.parse:python自带,容错不高 - lxml:解析速度快需要额外安装 `pip install lxml` - xml:同属lxml库,支持xml文档 `pip install lxml` - html5lib:容错高,速度慢 `pip install html5lib`
**初始化操作:创建BeautifulSoup对象**
``` python soup = BeautifulSoup(htmlText,'html.parser') ``` 初始化操作会打开一个html文件/页面,创建一个BeautSoup对象,同时初始化要指定解析器。
BeautifulSoup对象即可按照标准缩进格式输出:`soup.prettify()`
**结构化数据**
- `soup.title`查看title标签(包含标签输出html) - `soup.title.name`查看title标签的标签名 - `soup.title.string`查看title标签的text内容 - `soup.title.parent.name`查看title父标签名 - `soup.p`查看p标签(第一个) - `soup.p['class']`查看p标签的属性内容 - `soup.find_all('a')`查看所有a标签(以列表返回) - `soup.find(id="link3")`查看属性id='link3'的标签 - `soup.get_text()`获取文字内容
**对象种类**
bs4将html文档转换成一个复杂的树形结构,每个节点都将是python-bs4的对象,包括
- Tag对象:与html/xml中的tag相同;包含多种方法和属性; - `tag.name` 获取tag的名字 - `tag.attributes` 获取标签的某个属性值`tag['class']`操作方法和字典相同,支持增删改查; - 字符串对象:字符串包含在tab内;字符串对象不支持其它方法。 `tag.string`获取标签内的text文本内容 - BeautifulSoup对象标识一个文档的全部内容 - 特殊对象:注释内容对象
**遍历文档树**
我们可以通过点`.`取方式,获取子节点以及子节点的子节点直至没有子节点,但这种方法只可以获取第一个子节点;可以使用`.find_all()`可以当前节点下指定的所有tab节点
`.contents` 将当前tag的子节点以列表方式输出 `.children` 实现对tag子节点进行循环 `.descendants` 实现对所有子孙节点的递归循环 `.string` 当tag只有一个字符串对象时使用 `.strings` tag包含多个字符串使用,循环获取;可以使用`.stripped_strings`去除多余的空白内容
`.parent` 当前节点的父节点 `.parents` 递归获取元素的所有父节点
`.next_sibling` 遍历所有兄弟节点(之后的所有兄弟节点)`.next_siblings` `.previous_sibling` 遍历所有兄弟节点(之前的所有兄弟节点)`.previous_siblings`
**搜索文档树**
`.find_all( name , attrs , recursive , string , **kwargs )`
`.find( name , attrs , recursive , string , **kwargs )`
> 支持字符串、正则、列表、true、自定义方法
`.limit`支持定义搜索范围和数量 `.recursive`局限范围只搜索直接子节点
其它……[搜索文档树](https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id27)
**输出**
`.prettify()`格式化输出 `.unicode()`/`str()`压缩格式输出
`.get_text()`输出文本内容
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2t9x6jeycjgg8