您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

小白学爬虫(六) - 之 BeautifulSoup库的使用

5b51 2022/1/14 8:24:08 python 字数 17600 阅读 616 来源 www.jb51.cc/python

上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器。 beautifulSoup

概述

上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器。

beautifulSoup “美味的汤,绿色的浓汤”

一个灵活又方便的网页解析库,处理高效,支持多种解析器。利用它就不用编写正则表达式也能方便的实现网页信息的抓取

快速使用

通过下面的一个例子,对bs4有个简单的了解,以及看一下它的强大之处:

html = '''

The Dormouse's story

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie,<a href="http://example.com/lacie" class="sister" id="link2">Lacie and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie;
and they lived at the bottom of a well.

结果如下:

使用BeautifulSoup解析这段代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出。

同时我们通过下面代码可以分别获取所有的链接,以及文字内容:

print(soup.get_text())

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

下面是常见解析器:

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib,因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

下面是常见解析器:

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib,因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

下面是常见解析器:

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib,因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

标签选择器

在快速使用中我们添加如下代码:print(soup.title)print(type(soup.title))print(soup.head)print(soup.p)

通过这种soup.标签名 我们就可以获得这个标签的内容这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

获取名称

当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

获取属性

print(soup.p.attrs['name'])print(soup.p['name'])上面两种方式都可以获取p标签的name属性值

获取内容

print(soup.p.string)结果就可以获取第一个p标签的内容:The Dormouse's story

嵌套选择

我们直接可以通过下面嵌套的方式获取

print(soup.head.title.string)

子节点和子孙节点

contents的使用通过下面例子演示:

结果是将p标签下的所有子标签存入到了一个列表中

列表中会存入如下元素

children的使用

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

print (soup.p.children) for i,child in enumerate(soup.p.children): print(i,child)

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendantsprint(soup.descendants)同时这种获取的结果也是一个迭代器

父节点和祖先节点

通过soup.a.parent就可以获取父节点的信息

通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点soup.a.prevIoUs_siblings 获取前面的兄弟节点soup.a.next_sibling 获取一个兄弟标签souo.a.prevIoUs_sinbling 获取一个兄弟标签

标签选择器

在快速使用中我们添加如下代码:print(soup.title)print(type(soup.title))print(soup.head)print(soup.p)

通过这种soup.标签名 我们就可以获得这个标签的内容这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

获取名称

当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

获取属性

print(soup.p.attrs['name'])print(soup.p['name'])上面两种方式都可以获取p标签的name属性值

获取内容

print(soup.p.string)结果就可以获取第一个p标签的内容:The Dormouse's story

嵌套选择

我们直接可以通过下面嵌套的方式获取

print(soup.head.title.string)

子节点和子孙节点

contents的使用通过下面例子演示:

Elsie and and they lived at the bottom of a well.

"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)

结果是将p标签下的所有子标签存入到了一个列表中

列表中会存入如下元素

children的使用

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendantsprint(soup.descendants)同时这种获取的结果也是一个迭代器

父节点和祖先节点

通过soup.a.parent就可以获取父节点的信息

通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点soup.a.prevIoUs_siblings 获取前面的兄弟节点soup.a.next_sibling 获取一个兄弟标签souo.a.prevIoUs_sinbling 获取一个兄弟标签

标签选择器

在快速使用中我们添加如下代码:print(soup.title)print(type(soup.title))print(soup.head)print(soup.p)

通过这种soup.标签名 我们就可以获得这个标签的内容这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

获取名称

当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

获取属性

print(soup.p.attrs['name'])print(soup.p['name'])上面两种方式都可以获取p标签的name属性值

获取内容

print(soup.p.string)结果就可以获取第一个p标签的内容:The Dormouse's story

嵌套选择

我们直接可以通过下面嵌套的方式获取

print(soup.head.title.string)

子节点和子孙节点

contents的使用通过下面例子演示:

Elsie and and they lived at the bottom of a well.

"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)

结果是将p标签下的所有子标签存入到了一个列表中

列表中会存入如下元素

children的使用

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendantsprint(soup.descendants)同时这种获取的结果也是一个迭代器

父节点和祖先节点

通过soup.a.parent就可以获取父节点的信息

通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点soup.a.prevIoUs_siblings 获取前面的兄弟节点soup.a.next_sibling 获取一个兄弟标签souo.a.prevIoUs_sinbling 获取一个兄弟标签

find_all(name,attrs,recursive,text,**kwargs)可以根据标签名,属性内容查找文档

name的用法

结果返回的是一个列表的方式

同时我们是可以针对结果再次find_all,从而获取所有的li标签信息

attrs

例子如下:


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶