爬虫入门到精通-网页的解析(xpath)
时间:2022-05-07
本文章向大家介绍爬虫入门到精通-网页的解析(xpath),主要内容包括xpath的解释、XPath的基本使用、总结及注意事项、总结及注意事项、总结及注意事项、总结及注意事项、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
本文章属于爬虫入门到精通系统教程第六讲
在爬虫入门到精通第五讲中,我们了解了如何用正则表达式去抓取我们想要的内容.这一章我们来学习如何更加简单的来获取我们想要的内容.
xpath的解释
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
XPath的基本使用
要使用xpath我们需要下载lxml,在爬虫入门到精通-环境的搭建(http://mp.weixin.qq.com/s?__biz=MzU2OTAxNTcwMw==&mid=100000022&idx=1&sn=a7091cd4b98790b6a4ed017921e757fb&chksm=7c846dee4bf3e4f83758b7c9a9bd75822b006770b71c7c29722f2c28840edfbc705951960d7f#rd)这一章也说明怎么装,如果还没有安装的话,那就去下载安装吧
直接看代码实战吧。
from lxml import etree
# 定义一个函数,给他一个html,返回xml结构
def getxpath(html):
return etree.HTML(html)
# 下面是我们实战的第一个html
sample1 = """
<html>
<head> <title>My page</title></head>
<body>
<h2>Welcome to my <a href="#" src="x">page</a></h2>
<p>This is the first paragraph.</p>
<!-- this is the end -->
</body>
</html>"""
# 获取xml结构
s1 = getxpath(sample1)
# 获取标题(两种方法都可以)#有同学在评论区指出我这边相对路径和绝对路径有问题,我搜索了下#发现定义如下图
s1.xpath('//title/text()')
s1.xpath('/html/head/title/text()')
相对路径与绝对路径
总结及注意事项
- 获取文本内容用 text()
- 获取注释用 comment()
- 获取其它任何属性用@xx,如
- @href
- @src
- @value
sample2 = """
<html>
<body>
<ul>
<li>Quote 1</li>
<li>Quote 2 with <a href="...">link</a></li>
<li>Quote 3 with <a href="...">another link</a></li>
<li><h2>Quote 4 title</h2> ...</li>
</ul>
</body>
</html>
"""
s2 = getxpath(sample2)
总结及注意事项
- 上面的li 可以更换为任何标签,如 p、div
- 位置默认以1开始的
- 最后一个用 li[last()] 不能用 li[-1]
- 这个一般在抓取网页的下一页,最后一页会用到
sample3 = """
<html>
<body>
<ul>
<li id="begin"><a href="https://scrapy.org">Scrapy</a>begin</li>
<li><a href="https://scrapinghub.com">Scrapinghub</a></li>
<li><a href="https://blog.scrapinghub.com">Scrapinghub Blog</a></li>
<li id="end"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>
<li data-xxxx="end" abc="abc"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>
</ul>
</body></html>"""
s3 = getxpath(sample3)
总结及注意事项
- 根据html的属性或者文本直接定位到当前标签
- 文本是 text()='xxx'
- 其它属性是@xx='xxx'
- 这个是我们用到最多的,如抓取知乎的xsrf(见下图)
- 我们只要用如下代码就可以了 //input[@name="_xsrf"]/@value
sample4 = u"""
<html>
<head>
<title>My page</title>
</head>
<body>
<h2>Welcome to my <a href="#" src="x">page</a></h2>
<p>This is the first paragraph.</p>
<p class="test">编程语言
<a href="#">python</a>
<img src="#" alt="test"/>javascript
<a href="#"><strong>C#</strong>JAVA</a>
</p>
<p class="content-a">a</p>
<p class="content-b">b</p>
<p class="content-c">c</p>
<p class="content-d">d</p>
<p class="econtent-e">e</p>
<p class="heh">f</p>
<!-- this is the end -->
</body>
</html>"""
s4 = etree.HTML(sample4)
总结及注意事项
- 想要获取某个标签下所有的文本(包括子标签下的文本),使用string
- 如 <p>123<a>来获取我啊</a></p>,这边如果想要得到的文本为"123来获取我啊",则需要使用string
- starts-with 匹配字符串前面相等
- contains 匹配任何位置相等
- 当然其中的(@class,"content")也可以根据需要改成(text(),"content")或者其它属性(@src,"content")
最后再次总结一下
看完本篇文章后,你应该要
- 能学会基本所有的xpath的使用
- css和这个的原理一样,所以就不介绍了,可以参考
- CSS 选择器参考手册(http://www.w3school.com.cn/cssref/css_selectors.asp)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- flink教程-flink modules详解之使用hive函数
- 面试iOS 机会在自己手中
- Flink教程-将流式数据写入redis
- Flink教程-keyby 窗口数据倾斜的优化
- Flink源码分析之深度解读流式数据写入hive
- 浙大版《C语言程序设计(第3版)》题目集 习题10-1 判断满足条件的三位数
- 差分标记-HDU1556 Color the ball
- flink cep 案例之机架温度监控报警
- 详解flink 1.11中的新部署模式-Application模式
- 浙大版《C语言程序设计(第3版)》题目集 习题10-2 递归求阶乘和
- hadoop源码解析之RPC分析
- 存储过程和触发器
- hadoop源码学习之namenode启动
- 浙大版《C语言程序设计(第3版)》题目集 习题10-3 递归实现指数函数
- hadoop2.7.3源码解析之datanode注册和心跳机制