Linux下直接pip安装的lxml模块可能是不完整的,import lxml
正常,但是from lxml import etree
就会报错:
ImportError: cannot import name 'etree' from 'lxml'
同时,这个问题也是造成beautifulsoup库选择xml解析器时会报错的罪魁祸首:
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
网上各种解决方案大多在说lxml库本身的安装,什么卸载重装啊,降低版本啊,诸如此类。但这些方案并没有触及问题的本质,很可能并不管用。
其实,手动查看python site-packages目录下的lxml库文件,会发现其目录下是包含etree相关的文件的,这暗示问题并不在于本地的lxml库缺失/取消了etree模块:
实际上问题是出在lxml的依赖库有缺失,而不是lxml本身有缺失。 根据lxml的官方文档,lxml在非windows环境下需要libxml2和libxslt作为依赖库,而在Linux系统下安装lxml连同所有依赖库最快的方式是通过你使用的Linux发行版的包管理系统,如:
sudo apt-get install python3-lxml
这样Linux的包管理系统会自动将所有依赖项都安装好,不需要再手动一个一个安装。(你当然也可以选择手动一个一个安装,如果需要教程的话,同样在官方文档有提及,可自行查阅)
(我的系统是openwrt,因此包管理系统使用opkg,但是道理和用apt-get是一样的)
按照上面的方式重新安装好lxml后问题即可解决:
而在Windows下,直接pip安装或通过whl安装即可,内部已包含有所需的依赖库,正常情况下不会出现上述问题,这个在官网中也有提及,具体信息可参考官网原文。