Xpath是一款非常强大的XML/HTML解析框架,它能够将XML/HTML解析为类似于目录树的形式,叶子节点就是对应属性,而访问这些属性就和linux中的文件系统类似,以下列出部分语法,案例使用百度首页的部分html源码:
<head class="">
<script async="" src="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/plugins/every_cookie_4644b13.js"></script>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" class="">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" class="">
...
<title class="">百度一下,你就知道 </title>
<link rel="stylesheet" id="s_superplus_css_lnk" type="text/css" href="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/css/super_min_0833ec50.css">
<link rel="stylesheet" type="text/css" href="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/mancard/css/card_min_dee38e45.css">
<script class="">
window.sysTime=1538755883;
_manCard = {
asynJs : [],
asynLoad : function(id){
_manCard.asynJs.push(id);
}
};
</script>
</head>
例如此时我们获取到了这部分html,我们相关语法如下:
- 获取所有link标签的内容:
/html/head/link
- 获取link标签中的href超链接地址:
/html/head/link/@href (这里如果有多个link则会获取一个列表的url链接)
- 某个标签如果获取了多个,取其中第二个:
/html/head/link[2]
- 获取title中的文本内容:
/html/head/title/text()
以上是最基本的用法,还有一种十分常见的场景是,现在爬取到了一个html,这个html例如是豆瓣中的评论回复,假设每个人的评论回复是一个<ul>
表单下的<li>
这一列,具体就是:
<ul id="jdg_list" xxx...>
<li class>...</li>
<li class>...</li>
<li class>...</li>
<li class>...</li>
</ul>
<ul id="xxxx" ...>
<li class>...</li>
<li class>...</li>
<li class>...</li>
</ul>
如上页面上相同的标签可能还会有别的地方也有,但是我只想要获取id="jdg_list"
的这个表单中的列表内容,而对于其它地方用到的ul
标签中的数据,我们是不要的,此时的语法是通过//
和@
配合使用,具体语法:
//ul[@id="jdg_list"]/li
通过这种方式就获取到该数据了,但是还有一点对于//
而言,如果有/path//tag
这种用法表示在/path
标签路径下,获取所有的tag
标签的内容。
更多详细语法可以参考w3cSchool网站介绍:http://www.w3school.com.cn/xpath/xpath_syntax.asp