怎么在Python中使用xpath解析HTML

  介绍

本篇文章给大家分享的是有关怎么在Python中使用xpath解析HTML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Python有哪些常用库

Python常用的库:1. requesuts; 2. scrapy; 3.枕头;4.扭曲;5. numpy; 6. matplotlib; 7. pygama; 8. ipyhton等。

HTML文档:,

& lt; html>   ,& lt; body>   & lt;才能form>   ,,& lt; div  id=& # 39; leftmenu& # 39;比;   ,,,& lt; h4> text   ,,,& lt; ul  id=& # 39;中国# 39;祝辞& lt; !——, first 位置——比;   ,,,,& lt; li>……& lt;/li>   ,,,,& lt; li>……& lt;/li>   ,,,,,……   ,,,& lt;/ul>   ,,,& lt; ul  id=& # 39;英格兰# 39;祝辞& lt; !——, second 位置——比;   ,,,,& lt; li>……& lt;/li>   ,,,,& lt; li>……& lt;/li>   ,,,,,……   ,,,& lt;/ul>   ,,& lt;/div>   & lt;才能/form>   ,& lt;/body>   & lt;/html>

直接使用lxml处理:

, import 编解码器   ,得到lxml  import  etree   ,f=codecs.open (“ceshi.html",“r",“utf-8")   ,内容=f.read ()   ,f.close ()   ,树=etree.HTML(内容)

etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了,是不是有点小激动,现在就尝试下吧。

在使用xpath之前我们先来看看作为对照的jQuery和再保险。

在jQuery里要处理这种东西就很简单,特别是假如那个ul节点有id的话(比如是& lt; ul id=& # 39;中国# 39;祝辞):

(“# china") . each美元(函数(){…});

具体到此处是:

代码如下:

$ (“# leftmenu")定格(“h4:包含(& # 39;文本# 39;)“). next (“ul") . each(函数(){…});

找到id为leftmenu的节点,在其下找到一个内容包含为“文本”的h4节点,再取其接下来的一个ul节点。

在python里要是用再保险来处理就略麻烦一些:

block_pattern=re.compile (u" & lt; h4>档案& lt;/h4> (. * ?) & lt; h4>“,, re.I  |, re.S)   m=block_pattern.findall(内容)   item_pattern=re.compile (u" & lt; li> (. * ?) & lt;/li>“,, re.I  |, re.S)   项=item_pattern.findall (m [0])   for 小姐:拷贝项目:   print 才能;我

那么用xpath要怎么做呢?其实跟jQuery是差不多的:

=tree.xpath节点(“/后代::ul [@ id=& # 39;中国# 39;]“)

当然,现在没有id的话也就只能用类似于jQuery的方法了。完整的xpath应该是这样写的(注意,原文件中的标签有大小写的情况,但是在xpath里只能用小写):

代码如下:

节点=tree.xpath (u"/html/身体/形式/div [@ id=& # 39; leftmenu& # 39;]/h4(文本()=& # 39;文本# 39;]/祖辈::ul [1]“)

更简单的方法就是像jQuery那样直接根据id定位:

节点=tree.xpath (u"//div [@ id=& # 39; leftmenu& # 39;]/h4(文本()=& # 39;文本# 39;]/祖辈::ul [1]“)

这两种方法返回的结果中,节点[0]就是那个“文本”的h4节点后面紧跟的第一个ul节点,这样就可以列出后面所有的ul节点内容了。

如果ul节点下面还有其他的节点,我们要找到更深节点的内容,如下的循环就是把这些节点的文本内容列出:

节点=节点[0].xpath(“李/a")   for  n 拷贝节点:   print 才能;n。文本

对比三种方法应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而再保险则纯粹是基于普通text.RE对付简单的页面是没有问题,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的再保险模式可能会远比写一个xpath要复杂。特别是目前主流的基于CSS的页面设计方式,其中大部分关键节点都会有id——对于使用jQuery的页面来说则更是如此,这时xpath相比再保险就有了决定性的优势。

<强>,附录:基本xpath语法介绍,详细请参考xpath的官方文档

xpath基本上是用一种类似目录树的方法来描述在XML文档中的路径比。如用“/崩醋魑舷虏慵都涞姆指簟5谝桓觥?北硎疚牡档母诘?注意,不是指文档最外层节的标记点,而是指文档本身)。比如对于一个HTML文件来说,最外层的节点应该是“/HTML”。

同样的,“. .”和“。”分别被用来表示父节点和本节点。

xpath返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/HTML/头/scrpt”就会把脑袋里的所有脚本节点都取出来。

怎么在Python中使用xpath解析HTML