学习笔记
在Python爬虫之网页解析中,有三大网页解析工具,各有利弊: 三大解析工具对比:
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。细节可以参考W3School官方文档:http://www.w3school.com.cn/xpath/index.asp
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
开源的XPath表达式编辑工具有:
- XMLQuire(XML格式文件可用)
- Chrome插件 XPath Helper
- Firefox插件 XPath Checker
我们将在下面的例子中使用这个 XML 文档。
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
XPath 通配符可用来选取未知的 XML 元素。
更多语法参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp
我们经常使用//获取整个页面当中的元素,然后写标签名,然后再写谓词进行提取。比如:
- /和//的区别:/代表只获取直接子节点。//获取子孙节点。一般//用得比较多。当然也要视情况而定。
- contains:有时候某个属性中包含了多个值,那么可以使用函数。示例代码如下:
- 谓词中的下标是从1开始的,不是从0开始的。
lxml是一个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML数据。
lxml和正则一样,也是用C实现的,是一款高性能的Python HTML/XML解析器。lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析。我们可以利用之前学习的XPath语法,来快速地定位特定元素以及节点信息。
lxml python官方文档:http://lxml.de/index.html
需要安装C语言库,可使用pip安装:pip install lxml
附(所需文件): :
- 解析html字符串:使用进行解析。示例代码如下:
- 解析html文件:使用进行解析。示例代码如下:
这个函数默认使用的是解析器,所以如果碰到一些不规范的代码的时候就会解析错误,这时候就要自己创建解析器。
- 使用语法。应该使用方法。来执行xpath的选择。示例代码如下:
返回来的永远是一个列表。
- 获取某个标签的属性:
- 获取文本,是通过中的函数。示例代码如下:
- 在某个标签下,再执行xpath函数,获取这个标签下的子孙元素,那么应该在斜杠之前加一个点,代表是在当前元素下获取。示例代码如下:
解析上面的:
解析结果:
爬取最新上映的影片信息:https://movie.douban.com/cinema/nowplaying/changsha/
将目标网站上的页面抓取下来:
response.text返回的是一个经过解码后的字符串,是str类型
response.context:返回的是一个原生的字符串,就是从网页上抓取下来的,没有经过处理的字符串,是bytes类型
将抓取的数据根据一定的规则进行提取:
就这样,我们得到了正在上映的23部影片的标题、评分、打星、发行日期、时长、海报信息,解析后的结果为下:
官网:https://www.dytt8.net/
点击更多,进入电影详情页面第一页:
以第一步电影《神探蒲松龄》为例,我们第一步需要得到所有这些电影的详情页面的链接,即途中标红位置url:
抓取页面:
request会采取自己猜测的解码方式将抓取下来的网页进行解码,然后存储到text属性上去。
在电影天堂的网页当中,因为编码方式request库猜错了,所以就会产生乱码现象
数据解析:
结果:
对详情页进行解析,完整代码:
得到前三页的所有电影的详情信息,包括电影名称、年代、产地、类别、语言、字幕、上映日期、豆瓣评分、导演、演员等属性,结果为下:
-
和lxml一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
-
lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。
-
BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。
-
Beautiful Soup 3 目前已经停止开发,推荐现在的项目使用Beautiful Soup 4。
安装和文档
- 使用 pip 安装即可:
- 官方文档: v4.4.0 http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ v 4.2.0 https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
几大解析工具对比:
主要解析器对比:
6.2.1 说明
find_all的使用:
- 在提取标签的时候,第一个参数是标签的名字,然后如果在提取标签的时候想要使用标签属性进行过滤,那么可以在这个方法中通过关键字参数的形式,将属性的名字以及对应的值传进去。或者使用属性,将所有的属性以及对应的值放在一个字典中传给属性。
- 有些时候,在提取标签的时候,不想提取那么多,那么可以使用参数,限制提取多少个。
find和find_all的区别:
- find:找到第一个满足条件的标签就返回。说白了,就是只返回一个元素。
- find_all:将所有满足条件的标签。说白了,会返回很多元素(以列表的形式)。
获取标签的属性:
- 通过下标获取:通过标签的下标的方式:
- 通过attrs属性获取,示例代码:
string和stripped_strings、string属性以及get_text方法:
- string:获取某个标签下的非标签字符串。返回来的是个字符串。
- strings:获取某个标签下的子孙非标签字符串。
- stripped_strings:获取某个标签下的子孙非标签字符串,会去掉空白字符串。
- get_text:获取某个标签下的子孙非标签字符串,不是以列表的形式返回。
6.2.2 实战
给出要爬取的html网页:
1、获取所有tr标签:
结果:
2、获取第二个tr标签
结果:
3、获取所有class等于even的tr标签
结果:
4、将所有id等于test,class也等于test的a标签提取出来
结果:
#5、 获取所有a标签的href属性
结果:
6、 获取所有的职位信息
结果:
以下是一个html网页:
我们在style标签中改变样式时,有下列选择器用法:
- 根据标签的名字选取:
- 根据类型选择,那么要在类名的前面加一个点:
- 根据id名字选择,那么要在id的前面加一个#号:
- 查找子孙元素,那么要在子孙元素中间有一个空格:
- 查找直接元素,那么要在父子元素之间有一个>:
- 根据属性的名字进行查找,那么应该先写标签名字,然后再在中括号写属性的值:
- 在根据类名或者id进行查找 的时候,如果还要根据标签名进行过滤,那么可以在类的前面或者id的前面加上标签名字:
更多的选择器用法可以参考文档:30个你必须记住的CSS选择符
使用find_all方法可以方便地找出元素,但有时候使用css选择器的方式可以更加地方便。使用css选择器的语法,应该使用select方法。以下是一些实例(结果同上,略):
- 获取所有tr标签
- 获取第二个tr标签
- 获取所有class等于even的tr标签
- 获取所有a标签的href属性
- 获取所有的职位信息
- Tag: 中所有的标签都是Tag类型,并且的对象本质上也是一个Tag类型,所以其实一些方法比如find、find_all并不是BeautifulSoup的,而是Tag的。
- NavigableString:继承自python中的str,用起来就跟使用python中的str类型是一样的。
- BeautifulSoup:继承自Tag,用来生成BeautifulSoup的。对于一些查找办法,比如find、select这些,其实还是Tag的。
- Comment:这个没什么好说的,就是继承自NavigableString。
contents和children: 返回某个标签下的直接子元素,其中包括字符串,他们两的区别是:contents返回的是一个列表,children返回的是一个迭代器。示例:
结果:
官网:http://www.weather.com.cn/textFC/hb.shtml 爬取华北地区所有城市的最低气温:
结果:
我们要爬取全国所有城市最低气温:
结果:
得到temperature.html网页版柱状图:
GitHub源码地址:https://github.com/striver6/ChinaWeather.git