您的位置:首页 > 运维架构 > Linux

Red Hat Linux下python lxml的配置安装

2010-07-30 23:22 741 查看
手头要做的事情是:从某个资讯网站抓取大量的分类资讯,用于训练一个文本分类器。需要的步骤是:1、下载索引页;2、从索引页中抽取出新闻url;3、下载新闻网页;4、对新闻网页做正文抽取。

最后一步我不用担心,手头有现成的正文抽取程序。那么对前三步而言,一种最简单有效的实现方法是用Python:(1)下载可以直接用Python标准组件urllib(http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/pythonhtml/html/html_processing/extracting_data.html);(2)在html页面中抽取url可以使用lxml(http://codespeak.net/lxml/index.html)

下面写一写lxml的安装,详细的步骤可以参考http://codespeak.net/lxml/installation.html

(1)首先lxml依赖于两个lib,libxml和libxslt,在这里(ftp://xmlsoft.org/libxml2/)分别下载。我下的都是tar.gz版本,分别configure、make、su、make install。安装完成!

(2)安装lxml可以用Python的安装工具easy_install。安装easy_install的方法很简单,先下载脚本:wget -q http://peak.telecommunity.com/dist/ez_setup.py 。然后执行python ez_setup.py,它会自动下载并安装easy_install。这个时候,敲一下easy再按下tab,就会出现easy_install了,说明已经安装成功。

(3)执行easy_install lxml,会自动下载并安装lxml,相当方便。顺便说一句,下载后的模块放在了/usr/local/lib/python2.5下的site-packages中。

(4)重启python,输入import lxml,正常执行,说明安装成功。

问题处理:


完成安装后,我在python下尝试import lxml.html时报错了,错误信息很长:

File "<stdin>", line 1, in <module>

File "/usr/local/lib/python2.5/site-packages/lxml-2.2.6-py2.5-linux-x86_64.egg/lxml/html/__init__.py", line 12, in <module>

from lxml import etree

ImportError: /usr/local/lib/python2.5/site-packages/lxml-2.2.6-py2.5-linux-x86_64.egg/lxml/etree.so: symbol xmlSchematronFree, version LIBXML2_2.6.21 not defined in file libxml2.so.2 with link time reference

分析了一下,是libxml的版本不对,低于2.6.21,但是我刚刚装的明明是2.7.7版本的。打开/usr/lib64/,然后ls libxml*,却发现其中只有libxml2.so.2.6.16,奇怪了。又把其他几个目录翻了一遍,发现在/usr/local/lib下存在libxml2.so.2.7.7。猜想可能的原因是:原本系统中就装有2.6.16版本的libxml,目录是/usr/lib64,而刚才安装的2.7.7版本的默认路径在/usr/local/lib下,系统在加载libxml时优先搜索的是前者。于是,我把/usr/local/lib下的libxml*全部拷贝到/usr/lib64下,然后运行ldconfig。重启python,再import lxml.html,运行成功!

  写完这篇博文很久后发现,其实直接使用easy_install就好了,不需要自己手动去装libxml和libxslt。先下载脚本:wget -q http://peak.telecommunity.com/dist/ez_setup.py 。然后执行python ez_setup.py,自动下载并安装easy_install。完成后使用easy_install lxml,自动下载并安装lxml,这个过程中它会自己安装所有依赖的包。

但是后来出现了奇怪的问题,在直接使用ez_install安装lxml的机器上,我使用lxml.html.fromstring()来parse一个html文档时,得到html element对象是不完整的,缺少很多元素。一番推敲和google后发现,问题的根源在于lxml依赖的libxml库,ez_install自动安装的libxml库存在bug,手动将libxml库更新到2.7.7后,问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: