在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,使用xpath对html进行分析,获取抓取的信息。
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
①节点:
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。节点关系:父、子、同胞、先辈、后代
②xpath语法:
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
XMl文档实例:
1.实用路径表达式及结果:
2.谓语:用于准确定位某个节点的值。谓语一般被嵌套在方括号中;(***注意:下标从1开始不是0)
3.选取未知节点:
4.选取若干路径:通过使用”|“运算符,可以选取若干个路径
③xpath定位的五中方法:
第一种方法:通过绝对路径做定位(相信大家不会使用这种方式,写的有点多有点繁琐)
By.xpath("html/body/div/form/input")
第二种方法:通过相对路径做定位
By.xpath("//input")
第三种方法:通过元素索引定位
By.xpath("//input[4]")
第四种方法:使用xpath属性定位(结合第2、第3中方法可以使用)(***小坑:属性值为中文的话貌似识别不了)
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and@name='kw1']")
第五种方法:使用部分属性值匹配(最强大的方法)适用于属性有相同部分
By.xpath("//input[start-with(@id,'nice')
By.xpath("//input[ends-with(@class,'weixin')
By.xpath("//input[contains(@id,'ab')]")
④特殊用法:(转自:http://blog.csdn.net/jiangchao858/article/details/63314426)
xpath中text()和string(),data()的用法与特点。还有点号(.)表示当前节点。
text(): 它仅仅返回所指元素的文本内容
By.xpath("/book/author/text()")
取得是Tom cat,其中的John不属于author直接的节点内容
string():函数会得到所指元素的所有节点文本内容,这些文本将会被拼接成一个字符
/book/author/string()
取的内容是”Tom John cat”
data():大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能
By.xpath("/book/pricing/price/data()") By.xpath("/book/pricing/discount/data()")
分别取到20与0.8
text()不是函数,XML结构的细微变化,可能会使得结果与预期不符,应该尽量少用,data()作为特殊用途的函数,可能会出现性能问题,如无特殊需要尽量不用,string()函数可以满足大部分的需求
⑤xpath表达式的扩展用法
1.normalize-space()去掉前后的空格
2.count() 计数
3.starts-with()以何字符开始
4.contains()包含字符串
5.descendant::后代元素
6.descendant-or-self::包含元素本身和后代元素
7.parent::父元素
//span[text()='唯一标识']/parent::父元素
8.ancestor-or-self::包含元素本身和父元素
9.ancestor::所有父节点(一定会包括根节点)
10.following-sibling::选中元素所有的下游兄弟节点
11.preceding-sibling::选中元素的所有上有兄弟节点
12.div运算符做浮点除法运算, mod运算符做求余运算, floor函数返回不大于参数的最大整数(趋近于正无穷), ceiling返回不小于参数的最小整数(趋近于负无穷)
13.following::选中节点之后的所有节点, 除了祖先节点,属性节点和命名空间节点
14.preceding::选中节点之前的所有节点, 除了祖先节点,属性节点和命名空间节点
15.position() 当前元素的位置
更多内容参考:http://www.cnblogs.com/fdszlzl/archive/2009/06/02/1494836.html
xpath函数:http://www.360doc.com/content/14/0527/10/13497042_381350038.shtml