Python爬虫的第五天 --- XPath

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元素

具体的可参考下面的网站

http://www.runoob.com/xpath/xpath-syntax.html

运算符
参考网站

http://www.runoob.com/xpath/xpath-operators.html

不明白可自行去维基百科搜索

要注意的知识点
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'))

由于某些原因就先到这里,后面继续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值