BeautifulSoup库

## 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

posted @ 2020-11-03 15:37  Mirror王宇阳  阅读(112)  评论(0编辑  收藏  举报