当使用requests爬取得到html文档(静态网页)之后,需要从html文档字符串中提取和筛选出我们想要的数据,使用xpath来处理解析之后的html文档字符串,就可以快速的寻找和提取数据。
xpath的定位思路是利用html中的标签嵌套层级关系,利用路径的形式来匹配相应的元素节点,并返回匹配得到的节点对象(内容)。例如:html为根目录节点,html/body/div表示body中的一个div标签。
学习xpath主要学习其定位方法:包括绝对定位、相对定位、如何确定同一个层级下的指定的标签(利用属性)、从某个节点向前或向后定位节点、定位元素内容、定位属性…
xpath并没有返回定位得到的节点对象,而是将元素内容和标签属性都当做路径来进行定位,如:tree.xpath('//div[@class="song"]/img/@src')中的@src就表示这张图片的url,并没有提供get方法或者attrs等属性来获取属性。
另外也可以使用浏览器开发工具自动生成xpath路径或者使用xpath helper插件来调试xpath路径,就不需要我们花心思去构造xpath路径了。
目录
概括的分类有下面三类。而子子节点(孙子节点)也可以看成是某个节点的子节点,为了记忆,不需要使用子子节点这种节点关系。

预处理是指将给定的文档字符串进行格式化,例如:将不全的标签进行补全,将层级关系没有对齐的对齐……
- from lxml import etree
- etree.parse(filePath,) #本地的文件路径
- etree.HtML('page_text') #page_ text互联网中响应的数据
- from parsel import Selector
-
- # html 可以是请求某个网页的源码,也可以是html,xml格式的字符串
- selector = Selector(html)
得到selector对象之后就可以使用selector.xpath(路径字符串)来进行定位元素节点。下面将要介绍用pasel库使用xpath语法。
/:从html节点开始绝对定位&进入到下一个层级,eg:tree.xpath('/html/body/div') 。
//:从任意位置开始相对定位,eg:('//div[@class="song"]/p[3]')。
.:表示当前节点;..:表示当前节点的上一个节点。(类似于cmd的cd命令)。
@:用于匹配带有属性内容的元素节点,写在[]里面,例如:[@class="header"],他的作用就是修饰一个节点,以便于准确定位,如:tree.xpath('//div[@class="song"]/p[3]'),[@class="song"]用于修饰div标签,表示从这个div相对定位。
text():表示元素内容。
[index]:表示同一个层级中的第几个。如:tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]。
*:通配符,如"//div//*"选取div容器中的所有节点。
@*:@表示属性,@*表示任意属性,如[@*]。
node():某节点下的所有节点。

利用上面的基础语法基本上可以匹配到html文档任何地方的内容了,下面的语法不常用,截图来自各位大佬的博文。







文档字符串:

实战:extract()返回一个列表,列表内容为匹配得到的元素节点。


- #coding=utf-8
-
- from lxml import etree
-
- html = '''
-
-
-
友情链接查询 - 站长工具 -
-
-
-
-
-
Top News
-
World News only on this page
- Ah, and here's some more text, by the way.
-
... and this is a parsed fragment ...
-
- '''
- # 下面代码的功能是什么?
- page = etree.HTML(html.lower().decode('utf-8'))
- hrefs = page.xpath(u"//a")
- for href in hrefs:
- print href.attrib
打开每个浏览器的应用程序拓展商店,搜索Xpath Helper安装之后,重启浏览器即可。这个插件的主要作用就是验证我们构思的xpath路径是否正确及是否能够匹配到内容。