推广 热搜: 公司  快速  上海  中国  企业    未来  政策  系统  公司2 

Python网络爬虫之数据解析(一)

   日期:2024-11-19     作者:xinet    caijiyuan   评论:0    移动:http://www78564.xrbh.cn/mobile/news/27583.html
核心提示:学习笔记 在Python爬虫之网页解析中,有三大网页解析工具,各有利弊: 三大解析工具对比: 解析工具解

Python网络爬虫之数据解析(一)

Python网络爬虫之数据解析(一)

学习笔记

在Python爬虫之网页解析中,有三大网页解析工具,各有利弊三大解析工具对比

解析工具解析速度使用难度BeautifulSoup最慢最简单lxml快简单正则最快最难

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 来选取的。

下面列出了最有用的路径表达式

表达式描述nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点。…选取当前节点的父节点。@选取属性。

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

XPath 通配符可用来选取未知的 XML 元素。

更多语法参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp

我们经常使用//获取整个页面当中的元素,然后写标签名,然后再写谓词进行提取。比如

 
 
  1. /和//的区别:/代表只获取直接子节点。//获取子孙节点。一般//用得比较多。当然也要视情况而定。
  2. contains:有时候某个属性中包含了多个值,那么可以使用函数。示例代码如下
 
  1. 谓词中的下标是从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

(所需文件: :

 
  1. 解析html字符串:使用进行解析。示例代码如下
 
  1. 解析html文件:使用进行解析。示例代码如下
 

这个函数默认使用的是解析器,所以如果碰到一些不规范的代码的时候就会解析错误,这时候就要自己创建解析器。

 
 
  1. 使用语法。应该使用方法。来执行xpath的选择。示例代码如下
 

返回来的永远是一个列表。

  1. 获取某个标签的属性
 
  1. 获取文本,是通过中的函数。示例代码如下
 
  1. 在某个标签下,再执行xpath函数,获取这个标签下的子孙元素,那么应该在斜杠之前加一个点,代表是在当前元素下获取。示例代码如下
 
 

解析上面的:

 

解析结果

 
 

爬取最新上映的影片信息:https://movie.douban.com/cinema/nowplaying/changsha/ Python网络爬虫之数据解析(一)

将目标网站上的页面抓取下来

 

response.text返回的是一个经过解码后的字符串,是str类型

response.context:返回的是一个原生的字符串,就是从网页上抓取下来的,没有经过处理的字符串,是bytes类型

将抓取的数据根据一定的规则进行提取

 

就这样,我们得到了正在上映的23部影片的标题、评分、打星、发行日期、时长、海报信息,解析后的结果为下

 
 

官网:https://www.dytt8.net/ Python网络爬虫之数据解析(一)

Python网络爬虫之数据解析(一) 点击更多,进入电影详情页面第一页

Python网络爬虫之数据解析(一) 以第一步电影《神探蒲松龄》为例,我们第一步需要得到所有这些电影的详情页面的链接,即途中标红位置url

 

抓取页面

 

request会采取自己猜测的解码方式将抓取下来的网页进行解码,然后存储到text属性上去。

在电影天堂的网页当中,因为编码方式request库猜错了,所以就会产生乱码现象

数据解析

 

结果

 
 
 
 

Python网络爬虫之数据解析(一) 对详情页进行解析,完整代码

 

得到前三页的所有电影的详情信息,包括电影名称、年代、产地、类别、语言、字幕、上映日期、豆瓣评分、导演、演员等属性,结果为下

 
 
 
  • 和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。

安装和文档

  1. 使用 pip 安装即可
 
  1. 官方文档: 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

几大解析工具对比

解析工具解析速度使用难度BeautifulSoup最慢最简单lxml快简单正则最快最难

主要解析器对比

解析器使用方法优势劣势Python标准库BeautifulSoup(markup, “html.parser”)Python的内置标准库 执行速度适中 文档容错能力强Python 2.7.3 or 3.2.2前的版本中文档容错能力差lxml HTML 解析器BeautifulSoup(markup, “lxml”)速度快 文档容错能力强需要安装C语言库lxml XML 解析器BeautifulSoup(markup, [“lxml-xml”]) BeautifulSoup(markup, “xml”)速度快 唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup, “html5lib”)最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档速度慢 不依赖外部扩展

6.2.1 说明

find_all的使用

  1. 在提取标签的时候,第一个参数是标签的名字,然后如果在提取标签的时候想要使用标签属性进行过滤,那么可以在这个方法中通过关键字参数的形式,将属性的名字以及对应的值传进去。或者使用属性,将所有的属性以及对应的值放在一个字典中传给属性。
  2. 有些时候,在提取标签的时候,不想提取那么多,那么可以使用参数,限制提取多少个。

find和find_all的区别

  1. find:找到第一个满足条件的标签就返回。说白了,就是只返回一个元素。
  2. find_all:将所有满足条件的标签。说白了,会返回很多元素(以列表的形式)。

获取标签的属性

  1. 通过下标获取:通过标签的下标的方式
 
  1. 通过attrs属性获取,示例代码
 

string和stripped_strings、string属性以及get_text方法

  1. string:获取某个标签下的非标签字符串。返回来的是个字符串。
  2. strings:获取某个标签下的子孙非标签字符串。
  3. stripped_strings:获取某个标签下的子孙非标签字符串,会去掉空白字符串。
  4. 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标签中改变样式时,有下列选择器用法

  1. 根据标签的名字选取
 
  1. 根据类型选择,那么要在类名的前面加一个点
 
  1. 根据id名字选择,那么要在id的前面加一个#号
 
  1. 查找子孙元素,那么要在子孙元素中间有一个空格
 
  1. 查找直接元素,那么要在父子元素之间有一个>
 
  1. 根据属性的名字进行查找,那么应该先写标签名字,然后再在中括号写属性的值
 
  1. 在根据类名或者id进行查找 的时候,如果还要根据标签名进行过滤,那么可以在类的前面或者id的前面加上标签名字
 

更多的选择器用法可以参考文档:30个你必须记住的CSS选择符

使用find_all方法可以方便地找出元素,但有时候使用css选择器的方式可以更加地方便。使用css选择器的语法,应该使用select方法。以下是一些实例(结果同上,略

  1. 获取所有tr标签
 
  1. 获取第二个tr标签
 
  1. 获取所有class等于even的tr标签
 
  1. 获取所有a标签的href属性
 
  1. 获取所有的职位信息
 
 
  1. Tag: 中所有的标签都是Tag类型,并且的对象本质上也是一个Tag类型,所以其实一些方法比如find、find_all并不是BeautifulSoup的,而是Tag的。
  2. NavigableString:继承自python中的str,用起来就跟使用python中的str类型是一样的。
  3. BeautifulSoup:继承自Tag,用来生成BeautifulSoup的。对于一些查找办法,比如find、select这些,其实还是Tag的。
  4. Comment:这个没什么好说的,就是继承自NavigableString。

contents和children: 返回某个标签下的直接子元素,其中包括字符串,他们两的区别是:contents返回的是一个列表,children返回的是一个迭代器。示例

 

结果

 
 
 

官网:http://www.weather.com.cn/textFC/hb.shtml 爬取华北地区所有城市的最低气温

 

结果

 
 

我们要爬取全国所有城市最低气温

 

结果

 
 
 

得到temperature.html网页版柱状图

Python网络爬虫之数据解析(一) GitHub源码地址:https://github.com/striver6/ChinaWeather.git

本文地址:http://www78564.xrbh.cn/news/27583.html    迅博思语 http://www78564.xrbh.cn/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新资讯
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新资讯
点击排行
网站首页  |  二维码  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备2023022329号