网页解析完成的是从下载回来的html文件中提取所需数据的方法,一般会用到的方法有:
- 正则表达式:将整个网页文档当成一个字符串用模糊匹配的方式来提取出有价值的数据
- Beautidul Soup:一个强大的第三方插件
- lxml:解析html网页或者xml网页
不同解析办法只是匹配的方式不同,按道理来说几种方法可以相互替换,正则表达式的语法就不做赘述,这里介绍一下Python中的一个库Beautidul Soup,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。
Beautiful Soup
官方中文文档 搜索过程: 根据结构化解析的方式将对html的节点按照节点的名称/属性/文字进行搜索:
Beautiful使用方法为:
- 首先根据html网页和解析编码方式创建一个bs对象
- 调用
find_all
或者find
方法对节点进行搜索,或者使用find()
返回第一个匹配结果 - 对于搜索到的结果
find all(name,attrs,string)
其中name参数表示节点的标签名称,attr为节点的属性名称,string为节点的文字内容。
from bs4 import BeautifulSoup
#根据HTML网页字符串创建BeautifulSoupi对象
soup=BeautifulSoup(
html doc,#HTML文档字符串
'html.parser' #HTML解析器
from_encoding='utf8'#HTML文档的编码
)
#搜索节点
#方法:
#查找所有标签为a的节点
soup.find_al1('a')
#查找所有标签为a,链接符合/view/123.htm形式的节点
soup.find_al1('a',href=‘/view/123.htm')
soup.find_all('a',href=re.compile(r'/view/d .htm2))
#查找所有标签为div,class为abc,文字为Python的节点。class后加'_'是因为python的保留字
soup.find_all('div',class_='abc',string='Python')
find_all
方法会返回所有满足要求的节点的列表(tag对象组成的列表),至于节点内容的提取则需要借助get
方法(提取属性)或者ger_text()
方法(提取文本段落)。具体使用方法可以见之前的一次爬虫实战——爬取壁纸
由于 Beautiful Soup 的解析是基于正则表达式的(’html.parser
’),用在缺乏正确标签结构的破损网页上很有效。但是如果想要遍历更加复杂的页面,或者想要抓取器运行得更快并且快速地浏览页面,有很多更加高级的 Python 库可用。让我们看一下许多天才网页抓取器开发者最爱的库: lxml。
lxml
lxml是Python的一个解析库,可以用来解析html或者xml,同时支持xpath以及css两种解析方式,解析效率比较高,目前BeautifulSoup已经支持lxml解析方式,可以在实例化前声明一下即可(这种情况下二者的差异不大)
lxml集合BeutifulSoup(使用简单)和正则表达式(速度)的优点,使用简单,速度也不比正则表达式慢
csdn上一篇文章
CSS
CSS解析方法可以借助bs4中的BeautifulSoup('lxml').select()
方法实现,该方法会执行一个css选择
find 利用 DOM 来遍历元素,并基于祖先和家族关系找到它们,而 cssselect 方法利用 CSS 选择器来寻找页面中所有可能的匹配,或者元素的后继,非常类似于 jQuery。
Xpath
Xpath是一种基于xml文档的解析方式。
XPath 可以用于几乎所有主要的网页抓取库,并且比其他大多数识别和同页面内容交互的方法都快得多。事实上,大多数同页面交互的选择器方法都在库内部转化为 XPath。