python第三方库lxml使用笔记
1. 源码安装
由于想折腾一下,故选择源码安装。
从官网下载lxml最新版本(lxml-3.3.3)源码,linux机器可用curl工具拉取lxml源码,参考命令如下
curl -v --cacert ./https-ca/cacert.pem https://pypi.python.org/packages/source/l/lxml/lxml-3.3.3.tar.gz#md5=f2675837b4358a5ecab5fd9a783fd0e5 -o lxml-3.3.3.tar.gz其中:--cacert ./https-ca/cacert.pem指定我机器上https认证文件的全路径,其它机器则该路径需要修改。关于认证文件的获取方法,可参考我之前写的这篇笔记。
/configure --prefix=/home/slvher/tools/3rd-libs-for-py/libxslt-1.1.28/ --with-python=/home/slvher/tools/python-2.7.5/bin/python --with-libxml-prefix=/home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0 --with-libxml-include-prefix=/home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0/include/ --with-libxml-libs-prefix=/home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0/lib/libxml2和libxslt安装成功后,进入lxml源码目录,在某临时目录(假设为/home/slvher/tools/lxml-package)下安装lxml,参考命令如下:
python ./setup.py install root=/home/slvher/tools/lxml-package --with-xml2-config=/home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0/bin/xml2-config --with-xslt-config=/home/slvher/tools/3rd-libs-for-py/libxslt-1.1.28/bin/xslt-config将该临时安装目录下lxml和lxml-3.3.3-py2.7.egg-info两个文件夹cp至python安装目录的site-packages路径下,至此,lxml安装完成
>>> from lxml import etree Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: /home/slvher/tools/python-2.7.5/lib/python2.7/site-packages/lxml/etree.so: undefined symbol: exsltStrXpathCtxtRegister符号找不到,难道是安装有问题?
lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) lxml/etree.so: /usr/lib64/libxslt.so.1: no version information available (required by lxml/etree.so) libxslt.so.1 => /usr/lib64/libxslt.so.1 (0x00007fd95d51f000) libexslt.so.0 => /usr/lib64/libexslt.so.0 (0x00007fd95d40e000) libxml2.so.2 => /home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0/lib/libxml2.so.2 (0x00007fd95d1c2000) libz.so.1 => /usr/lib64/libz.so.1 (0x00007fd95d0ae000) libm.so.6 => /lib64/tls/libm.so.6 (0x00007fd95cf28000) libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x00007fd95ce13000) libc.so.6 => /lib64/tls/libc.so.6 (0x00007fd95cbde000) libgcrypt.so.11 => /usr/lib64/libgcrypt.so.11 (0x00007fd95ca94000) libgpg-error.so.0 => /usr/lib64/libgpg-error.so.0 (0x00007fd95c991000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fd95c88d000) /lib64/ld-linux-x86-64.so.2 (0x000000302ad00000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fd95c776000)可见,etree.so中依赖的libxslt.so.1和libexslt.so.0指向了机器/usr/lib64/路径下老版本的so库
export LD_LIBRARY_PATH=/home/slvher/tools/3rd-libs-for-py/libxml2-2.9.0/lib/:/home/slvher/tools/3rd-libs-for-py/libxslt-1.1.28/lib/:$LD_LIBRARY_PATH然后在python终端执行from lxml import etree
【参考资料】
1. lxml官网文档