前文传送门: 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(10):Session 和 Cookies 小白学 Python 爬虫(11):urllib 基础使用(一) 小白学 Python 爬虫(12):urllib 基础使用(二) 小白学 Python 爬虫(13):urllib 基础使用(三) 小白学 Python 爬虫(14):urllib 基础使用(四) 小白学 Python 爬虫(15):urllib 基础使用(五) 小白学 Python 爬虫(16):urllib 实战之爬取妹子图 小白学 Python 爬虫(17):Requests 基础使用 小白学 Python 爬虫(18):Requests 进阶操作 引言首先当然是各种资料地址敬上: 先看下官方对自己的介绍:
讲人话就是 Beautiful Soup 是一个非常好用、速度又快的 HTML 或 XML 的解析库。 Beautiful Soup 在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器。下表列出了主要的解析器,以及它们的优缺点(以下内容来自:https://beautifulsoup./zh_CN/v4.4.0/# ):
推荐使用 lxml 作为解析器,因为效率更高。在 Python2.7.3 之前的版本和 Python3 中 3.2.2 之前的版本,必须安装 lxml 或 html5lib ,因为那些 Python 版本的标准库中内置的 HTML 解析方法不够稳定。 提示: 如果一段 HTML 或 XML 文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看 解析器之间的区别 了解更多细节。 基本操作爬取对象还是小编的个人博客(小编看着博客的流量在暗暗心痛)。最基本的,还是先打印首页的 HTML 源码,使用的类库为 Requests + bs4。 import requests from bs4 import BeautifulSoup response = requests.get('https://www./') soup = BeautifulSoup(response.content, "html5lib") print(soup.prettify()) 结果就不贴了,太长,浪费大家翻页的时间。 首先先解释一下这里为什么选择了 上面这段代码主要是调用了 节点选择我们使用 Beautiful Soup 的目的是什么?当然是要选择我们需要的节点,并从节点中提取出我们需要的数据。 Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为4种: 我们直接调用节点的名称就可以选择节点元素,再调用 string 属性就可以得到节点内的文本了,这种选择方式速度非常快。 print(soup.title) print(type(soup.title)) print(soup.title.string) print(soup.a) 结果如下: <title>极客挖掘机</title> <class 'bs4.element.Tag'> 极客挖掘机 <a class="logo" href="/"> <img src="/favicon.jpg" style="margin-right: 10px;"/>极客挖掘机 </a> 可以看到,我们这里直接输出的 这里我们打印了 获取名称每个 tag 都有自己的名字,通过 tag = soup.section print(tag.name) 结果如下: section 获取属性一个 tag 可能有很多个属性, tag 的属性的操作方法与字典相同: print(tag['class']) 结果如下: ['content-wrap'] 也可以直接”点”取属性, 比如: print(tag.attrs) 结果如下: {'class': ['content-wrap']} 获取内容可以利用 print(soup.title.string) 结果如下: 极客挖掘机 嵌套选择在上面的示例中,我们的信息都是从通过 tag 的属性获得的,当然 tag 是可以继续嵌套的选择下去,比如我们刚才获取了第一个 print(soup.a.img) print(type(soup.a.img)) print(soup.a.img.attrs) 结果如下: <img src="/favicon.jpg" style="margin-right: 10px;"/> <class 'bs4.element.Tag'> {'src': '/favicon.jpg', 'style': 'margin-right: 10px;'} 可以看到我们在 关联选择在选择节点的时候,我们很少可以一步到位,直接选到所需要的节点,这就需要我们先选中其中的某一个节点,再已它为基准,再选择它的子节点、父节点或者兄弟节点。 子节点获取子节点,我们可以选择使用 contents 属性,示例如下: print(soup.article.contents) 结果太长了,小编就不贴了,这里输出了第一个 这里需要注意的是,列表中的每个元素都是 for child in enumerate(soup.article.children): print(child) 结果得到的还是相同的的 HTML 文本,这里调用了 想要得到所有的孙子节点的话,可以使用 for i, child in enumerate(soup.article.descendants): print(i, child) 父节点获取父节点可以使用 print(soup.title.parent) 结果有些长,就不贴了,各位同学可以自行尝试一下。 兄弟节点想要获取兄弟节点可以使用属性 print('next_sibling:', soup.title.next_sibling) print('previous_sibling:', soup.title.previous_sibling) print('next_siblings:', soup.title.next_siblings) print('previous_siblings:', soup.title.previous_siblings) 结果如下: next_sibling: previous_sibling: next_siblings: <generator object PageElement.next_siblings at 0x00000183342C5D48> previous_siblings: <generator object PageElement.previous_siblings at 0x00000183342C5D48> 可以看到, next_sibling 和 previous_sibling 分别获取节点的下一个和上一个兄弟元素,在这里并没有获取到值,而是获取了很多的空行,这个是在初始化 BeautifulSoup 的时候初始化出来的,而 next_siblings 和 previous_siblings 则分别返回所有前面和后面的兄弟节点的生成器。 示例代码本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。 参考 |
|