Python爬虫基础学习,从一个小案例来学习xpath匹配方法

学习目的是为了实践,而实践又可以加深我们的学习效率,今天给大家带来了lxml库的xpath匹配方法的实例!教程大家网上搜索有很多,我们只看实用功能,当然,如果您已经很熟练了,可以跳过不看的!

开始前准备

版本:python3.6

工具:pycharm、lxml库(pip安装即可)

内容:新浪新闻搜索关键字抓取相关信息并保存本地txt文档

思路

我们先打开网页url,看下它的页面数据是怎么加载的

搜索世界杯,然后在开发者工具中先抓包看看是否为json数据,结果发现并没有,那么直接打开源代码看看呢

源代码往下翻,到1200行左右看内容,眼熟不?所有的新闻都在源代码中存在,那么就简单了!直接可以抓取相关内容

开始写代码吧

先介绍一下xpath的语法,其实各种教程都有写,我们只需要记住几点

  • 它解析网页源代码的语法为etree.HTML(html)#html为网页源代码的文本形式
  • 它的匹配方式为data.xpath('//a[@class=***]/text()')#data为上步解析后的源码或者指定源码
  • 它匹配出来的结果为列表
  • 尽量不要用开发者工具提供的复制xpath路径功能,因为它对于后期维护或者修改你的代码很不友好

ok,不啰嗦了,直接上代码了

可以看到几行代码直接获取了所有新闻的标题,简单说一下那几行代码

1、url,有人可能已经注意到了,我在代码中用的url和网页实际的有些不同,那是因为url中?后面的内容,如果&后面的参数没有结果的话,是可以省略的,还有可以省略的就是类似时间戳等等,大家可以尝试下!

2、html = requests.get(url)常规的获取网页源代码,用的是requests库,因为这个网站没有反爬,所以很容易就取到了

3、data = etree.HTML(html.text)这里就是上文所说,解析源码的语法,而且lxml解析源码还一个好处就是,如果源码中存在非闭合的标签或者不是很规范的标签,它会自动补全,非常实用!

4、重点来了:infos = data.xpath('//div[@class="r-info r-info2"]/h2/a')这行代码是获取源代码中带有"r-info r-info2"值的class属性,并且它在div标签中,然后在标签内容中查找h2标签及h2标签下的a标签,我们来看看网页中的位置

这里需要注意的是,尽量选择用class属性去定位是比较好的,因为它的属性一般都是功能唯一的,比较方便!大家可以先复制属性值然后去源代码中搜索,如果唯一或者所在的标签全部是需要的内容,那么就可以使用,如果不是,请往上级查找!

5、因为刚才定位到的标签是列表形式,所以用for循环来遍历取出,这里重点讲解下string(.)的用法:

上面的标签内容是非常方便的,标题就在a标签下的文本中,但是依然存在一种情况,比如标题中含有我们是搜索的关键字的时候,它就不是只存在a标签下了,比如下图

短短一行,存在2个标签,a和a标签下的span标签,那么这种情况下,我们就需要使用string(.)来匹配了,它的主要功能是取出所属标签下所有文本内容!所以我们的语法就成了info.xpath('string(.)',然后用print显示就达到了效果!

好了,语法大概说到这,我们将所有的标题和url、简介全部抓取下来,然后写到txt文档,篇幅有限就抓5页的内容吧!

ok,内容全部写到文件了,当然了,还可以继续往下写,比如进入每一个新闻页面,抓取所有文本内容,也是一样的写法,大家有兴趣的可以自行完善哦!

最后

推荐一个我个人的学习方法,那就是多看多听多练!多看看大神的教程、博客、经验总结等等,多听听大神的思路分析,最重要的是多练,代码一定要多写!代码一定要多写!代码一定要多写!这样才能更快的学习进步!!大家加油

原文发布于微信公众号 - 云飞学python(P542110741)

原文发表时间:2018-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏屈定‘s Blog

Angular中引入第三方JS库

最近写http://www.itoolshub.com/的时候用到了日期时间选择器,Angular本身material2只有日期选择器,也不知道为什么官方不提供...

8723
来自专栏葡萄城控件技术团队

免费资源 | ActiveReports 报表控件发布多平台 Demo 代码集合

近期,ActiveReports 产品开发组的小伙伴针对大家比较关注的报表功能、常见问题、经典实现,特意准备了一个Demo代码集合,涉及WinFormss \ ...

2254
来自专栏非著名程序员

倍数提高工作效率的 Android Studio 奇技

这是从Philippe Breault的系列文章《Android Studio Tips Of the Day》中提取出来的自认为精华的部分。这些技巧在实际应用...

2419
来自专栏做全栈攻城狮

全栈工程师必备:安卓移动端手机开发,第六课

本系列课程 致力于老手程序员可以快速入门学习安卓开发。系统全面的从一个.Net程序员的角度一步步学习总结安卓开发。

1343
来自专栏小白课代表

Keil uVision 5 安装教程。

2134
来自专栏用户画像

测试用例参考示范

1.2K4
来自专栏Samego开发资源

Ubuntu搭建WebStorm开发NodeJS环境

1854
来自专栏Java成神之路

js_调试_01_14 个你可能不知道的 JavaScript 调试技巧

了解你的工具在完成任务时有很重要的意义。 尽管 JavaScript 是出了名的难以调试,但是如果你掌握了一些小技巧,错误和 bug 解决起来就会快多了。

1193
来自专栏lestat's blog

同一页面巧妙使用多个element-ui的upload组件

4694
来自专栏开源优测

Robot Framework | 02 从抛弃RIDE开始创建你的RFS测试

概述 大多数情况下,我们用RobotFramework时,一般基于其图形界面的RIDE来编辑、管理、执行用例。 今天我们分享下基于非编辑器模式的RobotFra...

5894

扫码关注云+社区

领取腾讯云代金券