Python爬虫入门(三):解析响应

目录

beautifulsoup(bs4)

1 解析器

2 四类对象

3 筛选函数

lxml

1 XPath

2 XPath基本常用语法

3 lxml解析html

4 例 XPath的运用


这是入门理论的最后一部分,完成了这一步就可以说是完成了一个简单的爬虫。用来解析响应中的Html文件的Python模块由很多,解析方式也有所不同。据我观察beautifulsoup的使用应该比lxml更加普及(我没有做过系统的调查,这个结果是根据查找到的资料数量来的),但是如何选择还要看使用者自己的喜好。

beautifulsoup(bs4)

beautifulsoup(下称bs4)使用Python编写,使用相较于lxml较容易,但是效率也较低。不过bs4支持很多解析器,lxml也是其中一种。

1 解析器

上文说到bs4支持很多解析器,我们在此列出:

-Python自带的标准库html.parser:因为是内置的库所以使用简单,但在Python2.7.3/3.2.2之前容错能力差

-lxml解析器lxml:速度快容错高,但是需要安装C语言库

-lxmlXML解析器lxml-xml”/“xml”:速度快支持XML,也需要安装C语言库

-html5lib解析器“html5lib”:速度慢但会以浏览器的形式解析文档

至于bs4解析HTML文档只需要小小的一步:

from bs4 import BeautifulSoup

soup_html=BeautifulSoup(你的html文本,"解析器,也就是我刚刚介绍里的粗体部分,也可以不填让bs4自己选择")

2 四类对象

bs4会将html文本转换成一个树形结构,而结构里的对象有四种,分别是Tag(标签)、NavigableString(字符串)、BeautifulSoup和Comment(注释)。下面我们分别解释这四类对象在html文本中的含义。

-Tag:tag的意思就是标签,它与html文本中的标签同义。BeautifulSoup对象也可以被看做是一个Tag。Tag中属性的访问方法如同字典,比如访问Tag对象a的href属性的写法为a[‘href’]。

-NavigableString:html文本中所有的字符内容(就是除了标签之外被直接展示出来的文字)都是NavigableString。

-BeautifulSoup:它就是完整的一个html文本,可以被看做一个特殊的Tag。

-Comment:注释,也可以被当做NavigableString被.string访问到。

判断一个子节点对象类型的方法:type(soup_html)==bs4.element.对象名

3 筛选函数

在将html文本转换成对象树之后,bs4会提供一系列方法来查询它们。下面会列举出一些常用的方法。

-BeautifulSoup.prettify():得到格式化的标准缩进的html文本。

-Tag.Tagname:用.运算符会返回第一个标签名为Tagname的标签。

-Tag.name:返回此标签的名字(按照这个写法可能有点多余,但是如果是你不知道标签名的soup呢?)

-Tag.contents:获得所有子标签的列表。

-Tag.parents:获得所有父标签的列表。

-Tag.string:获得标签内部的文字。(只在标签内仅有一个NavigableString对象的时候返回值,否则为None)

-Tag.strings:获得所有文字列表。

-Tag.stripped_strings:获得去掉换行符和空格的文字列表。

-Tag.Tagname[‘Attrname’]:返回第一个Tagname标签的Attrname属性的值。

-Tag.find(attr=”attrname”[,”tagname”]):这个方法查找第一个符合条件的标签其属性attr值等于attrname。

-Tag.find_all(attr=”attrname”[,]):同上,不过返回的是所有符合条件的标签。对于find与find_all函数,当attr为class时需要写作class_,这是为了避开保留字。

lxml

相较于beautifulsoup而言lxml使用C语言编写(而且beautifulsoup一次要读取整个DOM),所以在运行效率和速度等方面lxml是当之无愧的优势。但是lxml采用XPath解析HTML和XML文件,所以如果要用lxml对HTML进行解析还要先学习XPath。

1 XPath

XPath全称为XML Path Language,也就是XML路径(解析)语言。顾名思义它最初被设计用于XML文件的搜索,但是现在也支持HTML。

学习XPath的成本(初步运用)应与学习正则表达式类似。(这是个人观点)

2 XPath基本常用语法

关于XPath的概念等我们限于篇幅就不展示了,请自行寻找资料学习。以下列出的是在爬虫领域较为常用的语法。

-nodename:选取nodename节点的所有子节点

-/:选取根节点

-//:从当前节点选取任意位置节点

-.:选取当前节点

-..:选取当前节点的父节点

-@:选取属性

-[]:XPath中的“谓语”,也就是查找条件

-*:匹配任何元素节点

-@*:匹配任何属性节点

-node():匹配任何节点

-text():获取文本内容

3 lxml解析html

from lxml import etree

html_lxml=etree.HTML(html) #将html文本变成lxml的对象

html_lxml.xpath("XPath表达式") #用XPath搜索对象

4 例 XPath的运用

以bs4官网教程里的一段html(爱丽丝文档)为例,我将写出这段文本里部分元素节点的XPath以供读者参考。你也可以使用chrome的开发者工具->copy->copyXPath获得页面中标签的XPath。

 
 

<html> /html

    <head> /html/head

        <title>The Dormouse's story</title> /html/head/title

    </head>

    <body> /html/body

        <p class="title"><b>The Dormouse's story</b> /html/body/p[1]/b

</p> /html/body/p[1]

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

        <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and

        <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;

        and they lived at the bottom of a well.</p>

        <p class="story">...</p>

    </body>

</html>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值