python网络爬虫基础(2)--Beautiful Soup库

来源:互联网 发布:sql查询分析器在哪2005 编辑:程序博客网 时间:2024/05/29 11:33

之前已经从服务器上获得了我们想要的网页文件python网络爬虫基础(1)–request库
接下来要做的就是从这些网页中获得我们想要的数据,也就用到了方便简洁的Beautiful Soup库。


Beautiful Soup库

简介

Beautiful Soup是一个为了快速转换类似页面爬取的python库,它优点主要有三个:

  1. Beautiful Soup 提供了一些简单的方法和python风格的用法,可以定点,搜索,修改解析树,非常好的解析文件和提取你你想要的的工具。而且,编写的程序代码也十分精简。
  2. Beautiful Soup自动将输入的文档转换为Unicode或者UTF-8编码格式。使用时无需考虑编码问题,除非你的文档特别注明或者Beautiful Soup无法识别,那时你就必须费心找出文件的编码格式了。
  3. Beautiful Soup支持很流行的python解析器,比如lxml,html5lib等,可以使用不同的解析方式或者得到更快的解析速度和复杂度。

总之,Beautiful Soup可以解析你给它的任何东西然后给你返回一个树形的结构。你可以使用它查找所有的链接,查找有某种属性的链接,或者匹配某个URL的链接,亦或查找某种粗体表格文本等等。

使用

首先,得先安装Beautiful Soup库,可以选择到官网下载安装包Beautiful Soup安装包官网下载
顺便你也可以得到很多关于它的使用等很多信息。
比如很有用的帮助文档,还是中文的(当然也有纯英文,在下载页面可以找到)Beautiful Soup 4.2.0 文档
当然最方便快捷的还是用pip了pip install beautifulsoup4安装就好了。

然后确认安装成功,可以测试使用一下。

假设你已经从网站获取到网页,为test对象,然后从这里开始:

import requestsr = requests.get("(url)")test = r.text # 获取网页from bs4 import BeautifulSoup  # 全称beautifulsoup4,可简写为bs4soup = BeautifulSoup(test, 'html.parser')  # 这里采用最常用的html.parser解析器# 接下来就可以使用soup对象来进行进一步的操作print(soup.prettify())  # 比如我们可以打印观察一下这个煲好的汤是怎样的。# .prettify()方法用于标签,可以为HTML文本及内容增加'\n'

在这里需要对HTML标签有基本的了解,Beautiful Soup就将这些标签做成了一个标签树,然后方便对这些标签进行操作。

Beautiful Soup 库的解析器:

解析器 使用方法 准备 bs4的HTML的解析器 BeautifulSoup(mk,'html.parser') 安装bs4库 lxml的html解析器 BeautifulSoup(mk,'lxml') pip install lxml lxml的xml解析器 BeautifulSoup(mk,'xml') pip install lxml html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib



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

BeautifulSoup的对象

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag,NavigableString , BeautifulSoup , Comment

首先:

  1. Tag 对象与XML或HTML原生文档中的tag相同,就是指一个标签对象,用<></>为开头和结尾的对象。

    • .name每个tag都有自己的名字,通过 .name 来获取
    • attributes:标签的属性,字典形式组织,tag的属性的操作方法与字典相同:tag.attrs[key]
  2. NavigableString:标签内非属性字符串,常被包含在tag内。格式tag.string。tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:tag.string.replace_with("No longer bold")

  3. BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象。

  4. Comment 对象,标签内字符串的注释部分,是一个特殊类型的 NavigableString 对象

HTML内容的遍历

<>...</>标签之间构成了从属关系,形成了标签的属性结构。

下行遍历

  • .contents:子结点列表,将<tag>所有儿子结点存入列表
  • .children:子结点的迭代类型,与.contents类似,用于循环遍历儿子结点
  • .descendants:子孙结点的迭代类型,包含所有子孙结点,用于循环遍历
    这时,BeautifulSoup类型是标签树的根结点
# 遍历儿子结点for child in soup.body.children:    print(child)# 遍历子孙结点for child in soup.body.descendants:    print(child) 

上行遍历

  • .parent:结点的父亲标签
  • .parents:结点的先辈标签迭代类型,用于循环和遍历先辈结点

遍历时注意,所有的先辈结点包括BeautiSoup对象本身,要区别判断

for parent in soup.a.parents:    if parent is None:        print(parent)    else:        print(parent.name)

平行遍历

  • .next_sibling:返回按照HTML文本顺序的下一个平行结点标签
  • previous_sibling:返回按照HTML文本顺序的上一个平行结点标签
  • next_siblings:迭代类型,返回按照HTML文本顺序的后续所有平行结点标签
  • previoud_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行结点标签
# 遍历后续结点for child in soup.body.next_siblings:    print(child)# 遍历前续结点for child in soup.body.previous_siblings:    print(child) 
原创粉丝点击