经过一番研究以后才发现原来libxml2其实已经内置了对HTML的解析——即使是不很规范的HTML。所以上篇《xpath在XHTML解析中的应用 》完全是我学艺不精的产物。囧
不过好处是顺便学习到了j7a7c7k7 兄推荐的tidy(用的是令狐提供的µTidylib ),这也是个好东东。
现在来看如何直接使用lxml(即前文说过的libxml2的一个python binding)处理那个样本“页面 ”:
import codecs
from lxml import etree
f=codecs.open("raptor.htm","r","utf-8")
content=f.read()
f.close()
tree=etree.HTML(content)
Bingo!果然成功。关键就在于etree提供了HTML这个解析函数。之后的事情就好办多了,因为可以直接对HTML使用xpath。
不过这个样本页面中要解析的部分有一个问题就是:那个ul节点没有id,所以只好麻烦一点了。
完整的xpath应该是这样写的(注意,原文件中的TAG有大小写的情况,但是在XPATH里只能用小写):
nodes=tree.xpath(u"/html/body/form/div[@id='leftmenu']/h3[text()='档案']/following-sibling::ul[1]")
这句xpath的意思是寻找这样一个东东。