XPath语法
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言。
选取节点:
XPath使用路径表达式来选取XML文档中的节点或者节点集。
一些语法
表达式 | 描述 | 示例 | 结果 |
---|---|---|---|
/ | 选取此节点的所有子节点 | /html | 选取html下的所有子节点(注意:只能是子节点,不能是孙节点。且必须从根节点开始) |
// | 从全局节点中选择节点,随便哪个位置 | //div | 从全局节点中找到所有的div节点 |
@ | 选取某个节点的属性 | //div[@id] | 选择所有拥有id属性的div节点 |
. | 选取当前节点 | //head/meta[./@class] | 当前meta节点的所有class属性 |
. . | 选取当前节点的父节点 | //meta[./@class] | 当前meta节点的父节点的所有class属性 |
谓语:
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。
路径表达式 | 描述 |
---|---|
//head/meta[1] | 选取head下的第一个meta子元素 |
//head/meta[last()] | 选取head下的倒数第二个meta元素 |
//head/meta[position() < 3] | 选取head下前两个meta元素 |
//head/meta[@class] | 选取拥有class属性的meta元素 |
//book[@price=10] | 选取所有属性price=10的bookyuansu |
通配符
通配符 | * | @* | node() |
---|---|---|---|
描述 | 匹配任意字节 | 匹配节点中的任何属性 | 匹配任何类型的节点 |
示例 | //head/* | //head/@* | |
结果 | 选取head下的所有子节点 | 选取所有带有属性的head元素 |
选取多个路径:
通过在路径表达式中使用“|”运算符,可以选取若干个路径。
//head/meta | //body//li
#选取所有head元素下的meta元素以及body元素下的所有li元素
具体的可参考下面的网站
运算符
参考网站
不明白可自行去维基百科搜索
要注意的知识点
1,/ 和 // 的区别:/ 代表只获取直接子节点。 // 获取子孙节点。
2,contains:有的时候某个属性中包含了多个值,那么就可以使用contains
函数。示例代码如下:
//div[contains(@class,'job_detail')]
3,谓词中的下标是从1开始的,不是从0开始的。
lxml库
lxml是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML数据。
基本使用
我们可以利用他来解析HTML代码,并且在解析HTML代码的时候,如果HTML代码不规范,他会自动的进行补全。示例代码如下:
from lxml import etree
test = """
<head>
<title></title>
<meta charset="UTF-8"/>
<script src="test.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
function WhoisE () {
var e;
e = document.getElementsByClassName("classA");
e = document.getElementsByTagName("div");
e = document.getElementById("d1");
e.setAttribute("align","center");
e.setAttribute("data-test","2");
e.style.fontFamily="微软雅黑";
e.style.backgroundImage="url(img/HBuilder.png)";
e.style.cssText="background-image: url(img/HBuilder.png);";
switch (e.style.display){
case "-webkit-box":
break;
default:
break;
}
if (e.getAttribute("class")!="classA") {
e.className="classA";
}
e.innerHTML="<font color='#CCCCCC'></font>";
e = document.getElementById("a1");
e.href="#a1";
e.target="_blank";
e = new Image();
e.src="img/HBuilder.png";
e = window.indexedDB || window.webkitIndexedDB || window.msIndexedDB || window.mozIndexedDB;
if (typeof(e)!="undefined") {
e.open("test");
}
var head = document.getElementsByTagName("head")[0];
with (head){
var l = lastElementChild;
removeChild(l);
}
e = document.createElement("link");
e.rel="stylesheet";
e.type="text/css";
e.href="test.css";
head.appendChild(e);
var ss="e is ";
if (e.getAttribute("data-test")==null) {
ss=ss+e.outerHTML;
} else{
ss=ss+"unknow";
}
alert(ss)
}
addEventListener("DOMContentLoaded",function () {
finishLesson(1)
})
</script>
<style type="text/css">
body{
text-align: center;
-webkit-user-select: none;
}
input[type=button]{
width: 90px;
}
ul{display: none}
#d1{
font-family: "微软雅黑";
background-image: url(img/HBuilder.png)
}
</style>
<link rel="stylesheet" type="text/css" href="test.css"/>
</head>
"""
htmlelement = etree.HTML(test)
print(etree.tostring(htmlelement,encoding='utf-8').decode('utf-8'))
利用etree.parse()方法解析html文件。示例代码如下:
from lxml import etree
#读取renren.html
html = etree.parse('renren.html')
print(etree.tostring(html,encoding='utf-8').decode('utf-8'))
这个函数默认使用的是XML
解析器,所以如果碰到一些不规范的HTML
代码的时候就会解析错误,这个时候就要自己创建HTML
解析器。
from lxml import etree
parse = etree.HTMLParser(encoding='utf-8')
htmlelement = etree.parse("lagou.html",parser=parse)
print(etree.tostring(htmlelement,encoding='utf-8').decode('utf-8'))
由于某些原因就先到这里,后面继续。