前一阵参加了一个Python的活动,其间老董的讲座是讨论网页爬虫技术的。其中提到了一下关于页面解析的问题,他推荐了三种技术。其中有用到libxml2里的xpath来处理,我就跟令狐谈到我曾经也用过这个东东。令狐建议我把这个东东说一下,于是我就写了这一篇。
惭
愧的是我最初在python里用xpath时用的不是libxml2,而是一个不记得是什么的XML库。后来因为那个库不知道为什么找不到了或者是新版本
不再提供xpath支持等原因,才通过google找到libxml2。就像对pcre的误解一样,我原来还以为libxml2是python的库,后来
才知道它是C的库,我用的只是python的包装而已。
很多对XML接触不多的人,刚开始的印象都会觉得XML不就是一种数据存储方式嘛,但是实际上在一些极端XMLer看来,XML是一种强大的编程语言。不相信的话试着写一个XSL就知道了。我对xpath的了解其实也是源于多年写的一个程序需要而对XSLT作了点研究。
关于xpath的权威资料,当然要算W3C的XPath官方文档
。
下面以一个例子来说明吧。假设现在我们需要解析这样一个“页面
”,取出其中所有“档案”段的内容,并且解析为一个个月份值。这个功能当然也可以用正则表达来式来实现——这也是老董提到的三种技术之一——而且事实上并不会比用xpath麻烦,不过这里只是举例说明,就不这么讲究了。
首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上被推荐的python binding是lxml(我以前用的不是这个,不过我也不记得是哪个了),所以现在就以这个为例吧。
安装方法很简单: easy_install lxml 即可——什么?你不知道什么叫easy_install?那就猛戳PEAK这里
学习一下吧。
个么然后是不是就可以直接用了呢?试试看吧:
import codecs
from lxml import etree
f=codecs.open("raptor.htm","r","utf-8")
tree=etree.parse(f)
很不幸,可耻滴失败鸟。因为这个页面并不是一个qualified的XHTML——别说中国了,就算在外国也没有那么多合格的XHTML页面,所以还是要可耻滴操起RE(正则表达式)来做一个预处理。
# encoding=utf-8
import codecs
import re
from StringIO import StringIO
from lxml import etree
f=codecs.open("raptor.htm","r","utf-8")
content=f.read()
f.close()
block_pattern=re.compile(u"<h3>档案</h3>(.*?)<h3>", re.I | re.S)
m=block_pattern.findall(content)
f=StringIO(m[0])
tree=etree.parse(f)
这回就不出错了嘛。现在被etree所处理的XML其实就是这么一段内容,很简单。
<ul>
<li><a id="_ctl0_LeftColumn-5_Categories_CatList__ctl1_LinkList__ctl1_Link" href="http://borland.mblogger.cn/raptor/archive/072009.aspx">2009年7月 (1)</a></li>
...
</ul>
在jQuery里要处理这种东西就很简单了,比如这样:
$("li").each(function(){...});
但是在python里要是用RE来处理就略麻烦一些,比如这样:
...
m=block_pattern.findall(content)
item_pattern=re.compile(u"<li>(.*?)</li>", re.I | re.S)
items=item_pattern.findall(m[0])
for i in items:
print i
那么换成用xpath要怎么做呢?是这样的:
...
m=block_pattern.findall(content)
f=StringIO(m[0])
tree=etree.parse(f)
nodes=tree.xpath("/ul/li")
for n in nodes:
print n.getchildren()[0].text
看上去不比用RE简单嘛,那为什么要用xpath呢?
这次换个需求,比如这次要取的是id为“_ctl0_LeftColumn-5_Categories_CatList__ctl1_LinkList__ctl4_Link”的链接。
jQuery版:
$("#_ctl0_LeftColumn-5_Categories_CatList__ctl1_LinkList__ctl4_Link").text();
RE版:
...
m=block_pattern.findall(content)
id_pattern=re.compile(u"<a[^>]*id=\"_ctl0_LeftColumn-5_Categories_CatList__ctl1_LinkList__ctl4_Link\"[^>]*>(.*?)</a>", re.I | re.S)
print id_pattern.findall(m[0])[0]
xpath版:
...
m=block_pattern.findall(content)
f=StringIO(m[0])
tree=etree.parse(f)
nodes=tree.xpath("//a[@id='_ctl0_LeftColumn-5_Categories_CatList__ctl1_LinkList__ctl4_Link']")
print nodes[0].text
对
比三段代码与前一个版本的区别,应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而RE则纯粹是基于plain
text,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的RE pattern可能会远比写一个xpath要复杂。
当然,xpath的最大问题就是对页面要求比较高,必须是一个合格的XHTML,否则还是需要用一个RE去取出合格的片段来进行处理。不知道有没有什么库可以提供页面的XHTML格式化功能?
分享到:
相关推荐
XPath是一种用于在XML文档中查找信息的语言,它类似于在文件系统中使用路径导航的概念。XPath语言被广泛应用于多种技术中,包括XSLT(可扩展样式表语言转换)、XQuery以及XPointer。XSLT是用于转换XML文档的技术,而...
在实际应用中,XPath Helper对于网页爬虫开发者来说是必不可少的工具。它可以帮助他们准确地定位到需要抓取的数据,避免因DOM结构复杂而产生的定位问题。同时,对于前端开发者而言,它也有助于调试和优化页面的XHTML...
XPath在许多高级XML应用中扮演着重要角色,尤其作为W3CXSLT标准的核心部分。此外,XQuery和XPointer也是基于XPath构建的。 在深入学习XPath之前,建议读者至少熟悉以下概念: - **HTML/XHTML**:虽然不是必需的,但...
7. **浏览器兼容性**:虽然XHTML的初衷是为了提高标准合规性,但在实际应用中,考虑到浏览器的兼容性,开发者往往需要在严格遵守XHTML规范的同时,兼顾传统HTML的解析方式。 通过《XHTML实例精解》的学习,读者可以...
XML(可扩展标记语言,eXtensible ...这三个技术在Web开发、数据集成和信息管理等领域有着广泛的应用,对初学者来说是深入了解Web技术的重要起点。通过深入学习和实践,你可以构建出高效、灵活的数据处理和展示方案。
由于XHTML是XML的子集,因此它可以与XML的其他应用无缝集成,如XSLT(用于转换XML文档)和XPath(用于在XML文档中查找信息)。这使得XHTML文档可以更方便地进行数据交换和处理。 **6. XHTML与Web标准** XHTML是W3C...
在XHTML中,一些特殊字符如 `、`>`、`&` 必须使用实体引用,以避免解析错误。例如,`应写作 `<`,`>` 写作 `>`,`&` 写作 `&`。 4. **DOCTYPE声明** 每个XHTML文档都应该以DOCTYPE声明开头,以告知...
【计算机软件开发和应用领域十大关键技术解析】 在不断发展的信息技术领域,掌握最新的关键技术和知识是保持竞争力的关键。本文将深入探讨计算机软件开发和应用领域的十大核心技术,这些技术不仅影响着当前的就业...
【XML简介】 ...在上述示例中,XML数据描述了一个图书馆及其分类和书籍,这些数据可以通过PHP的DOM、SimpleXML或XPath扩展进行解析、操作和展示。在后续文章中,会详细介绍如何在PHP中实现这些功能。
在IT行业中,前端开发是构建网页和Web应用程序的关键部分,涉及的主要技术包括CSS、JavaScript、jQuery、xHTML、XML以及XMLHttpRequest(通常简称为XHR)。这些技术共同构成了现代Web开发的基础,下面将对它们进行...
XPath是一种在XML文档中查找信息的语言。虽然这里爬取的是HTML文档,但由于HTML可以视为XML的一种特殊形式,因此XPath同样适用于HTML文档的解析。 **示例代码解析**: #### 2.1 百度知道的数据提取 ```python id_...
libxml2库是C++中处理XML文档的强大工具,包含了丰富的功能和API,能够方便地解析、创建和操作XML文档,同时也支持XPath和XSLT,为XML的处理提供了全面的解决方案。在实际项目中,正确配置和使用libxml2可以极大地...
另外,XPath和XSLT是XML处理中的两个重要工具,XPath用于在XML文档中查找信息,而XSLT则用于转换XML文档结构。 为了提升XML的应用能力,你需要掌握XML的相关规范,如XML 1.0、XML Namespaces、XML Base等。同时,...
6. **兼容性**:HtmlAgilityPack支持多种.NET平台,包括.NET Framework、.NET Core和.NET Standard,这使得它可以在各种应用场景中使用,如桌面应用、Web应用、移动应用等。 在实际使用HtmlAgilityPack分析工具时,...
根据提供的文件信息,我们可以深入...本书深入探讨了XML及其在Web数据管理中的应用,并详细介绍了XPath和XQuery两种重要的查询语言。对于想要深入了解Web数据管理和XML文档处理的人来说,这是一本非常有价值的参考书。
LIBXML2提供了丰富的API(应用程序编程接口),允许开发者在C语言环境中高效地解析、创建、修改XML文档。以下是一些关于LIBXML2的重要知识点: 1. **XML解析**:LIBXML2提供了解析XML文档的功能,它可以读取XML文件...
在实际应用中,学习XML网页制作还需要掌握XML命名空间、DTD(Document Type Definition)或XML Schema来定义文档结构,以及XPath和XQuery用于查询XML数据。理解这些工具和技术,将帮助你更好地利用XML进行网页设计和...