⑴ python LXML模块死活安装不了怎么办
1、首先请确认安装了xcode commond line tool 也就是xcode的命令行工具,因为编译lxml需要用到cc 等命令
所以先在命令行输入
xcode-select --install
2、安装完命令行工具 用pip来安装你所需要的lxml
这时候如果提示头文件未找到的话 用locate命令定位一下头文件的位置
locate xmlversion.h
3、初次使用locate命令会提示安装
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
4、安装一下就好了
之后定位到了locate之后 设置一下环境变量
export C_INCLUDE_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/
5、那么在编译lxml的时候 就自动会到这个路径下搜索头文件
然后pip install 就可以啦。
6、另外如果系统装了几个版本的xcode 那么打印看好xcode的路径
sudo xcode-select -p
7、如果想切换到另一个xcode路径下 可以考虑在bash.profile进行全局的设置
或者在终端设置变量
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
或者
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer
8、如果这些安装完了之后,最后引用Scrapy包得时候报错
请尝试删除
cd /Library/Python/2.7/site-packages/
sudo rm -rf six*
9、如果是Mac OSX 10.11 有可能会报错 因为mac系统多了sip 关闭sip就OK了
具体关闭方法请网络
基本我就踩到了这些坑。
⑵ python-xml怎么安装啊
pip install lxml python2.7.9 自带pip安装工具。 看下面图片,图中显示本人电脑已经安装好了。
1.
直接
下载的模块文件中已经有了模块的文件,有些模块只有一个文件,比如较早版本的BeautifulSoup,有些是一个文件夹,比如新版本BeautifulSoup就是一个叫做bs4的文件夹。
把这些文件直接到你的python路径下的/Lib/site-packages文件夹中,比如C:/Python27/Lib/site-packages。之后就可以在程序里直接引用了:
import BeautifulSoup
或者
from bs4 import BeautifulSoup
这是根据你放置的文件位置不同而决定的。
网上有人说直接放在Lib文件夹中就可以了。的确这样也行,但Lib文件夹中都是自带的模块,看一下就会发现我们用过的random、re等模块的代码文件。而外部模块一般放在site-packages文件夹中。
2.
setup.py
很多模块里都附带了setup.py文件,有同学直接双击了,然后发现没有用。
它的使用方法是从命令行去到setup.py所在的路径下,运行
python setup.py install
仔细看一下安装时输出的信息可以发现,在线学习这个命令做的事情其实也就是帮你把模块的代码到site-packages文件夹。
3.
setuptools
使用setuptools可以直接根据模块名称来自动下载安装,不需要自己再去寻找模块的安装文件。不过在使用之前,你得先安装setuptools自身。
windows平台的32位python,可以直接下载setuptools的exe文件安装。
⑶ Python lxml包下面的xpath基本用法
对于网页数据抓取,有BeautifulSoup、lxml以及正则表达式三种方法,其中正则表达式过于复杂,而beautifulsoup和lxml使用起来较为方便。以前简单使用过beautifulsoup(美味汤),后面为了扩展一下,熟悉一下lxml进行数据抓取。
先贴一个lxml的简仿早单框架:
其中,最主要的在于xpath路径的获取和解析,而XPath就是地址,具体地,就是需要知道所要寻找的内容处在哪个地址下。一般而言,我们可以根据开发者工具来定位我们需要的元素,然后右击选择其所在xpath,选择初步的路径,如下图所示,
这只是一种简单的方法,更重要的,需要掌握xpath的语法规则,下面分别论述。
使用xpath获取信息,主要包括获取本文和获取属性,基本用法为
对比可以看出,一个是采用text()获取文本,一个是采用@属性获取属性值。而前面标签后面方括号就是来对标签进行筛选的。一般而言,通过选择器可以获取诸如/html/body/div[@class="useful"]/ul/li/text()的信息,但是开头的信息没有标志性,采用//div[@class="useful"]/ul/li/text()即可。
这个地方即涉及到了xpath的语法选择,主要包括以下几点:
而在选择器方备缓雀面,包括以下几个
除此之外,在获取了一个元素之后,我们需要获取其下面元素的属性,即要对基于xpath获取的元素再次采用xpath,此时的获取方式为:
另外,我们也可以获取节点下面所有的字符串,方法为string(.),示例为:
懒得打字了,下面的截图来自W3Cschool, https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html
主要的Xpath运算符包括以下:
按顺序选择等进一步的内容可以移步 https://www.w3cschool.cn/lxml/_lxml-eh1k3fk6.html
具体到不同的网页上,需要的其他哪陆知识就更多了,慢慢补充吧。不过似乎还是beautifulsoup好用一些,哈哈。
参考资料:
https://blog.csdn.net/weixin_39851008/article/details/109960957
https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html
⑷ python lxml库怎么安装
lxml是Python中与XML及HTML相关功能中最丰富和最容易使用的库。lxml并不是Python自带的包,而是为libxml2和libxslt库的一个Python化的绑定。它与众不同的地方是它兼顾了这些库的速度和功能完整性,以及纯Python API的简洁性,与大家熟知的ElementTree API兼容但比之更优越!但安装lxml却又有点麻烦,因为存在依赖,直接安装的话用easy_install, pip都不能成功,会报gcc错误。下面列出来Windows、Linux下面的安装方法:
【Windows系统】
先确保Python已经安装好,环境变量也配置好了,相应的的easy_install、pip也安装好了.
1. 执行 pip install virtualenv
[python] view plain print?
C:\>pip install virtualenv
Requirement already satisfied (use --upgrade to upgrade): virtualenv in c:\python27\lib\site-package
s\virtualenv-12.0.4-py2.7.egg
2. 从官方网站下载与系统,Python版本匹配的lxml文件:
http //pypi.python.org/pypi/lxml/2.3/
NOTE:
比如说我的电脑是Python 2.7.4, 64位操作系统,那么我就可以下载
[python] view plain print?
lxml-2.3-py2.7-win-amd64.egg (md5) # Python Egg
或
lxml-2.3.win-amd64-py2.7.exe (md5) # MS Windows installer
3. 执行 easy_install lxml-2.3-py2.7-win-amd64.egg
[python] view plain print?
D:\Downloads>easy_install lxml-2.3-py2.7-win-amd64.egg # 进入该文件所在目录执行该命令
Processing lxml-2.3-py2.7-win-amd64.egg
creating c:\python27\lib\site-packages\lxml-2.3-py2.7-win-amd64.egg
Extracting lxml-2.3-py2.7-win-amd64.egg to c:\python27\lib\site-packages
Adding lxml 2.3 to easy-install.pth file
Installed c:\python27\lib\site-packages\lxml-2.3-py2.7-win-amd64.egg
Processing dependencies for lxml==2.3
Finished processing dependencies for lxml==2.3
NOTE:
1. 可用exe可执行文件,方法更简单直接安装就可以
2. 可用easy_install安装方式,也可以用pip的方式
[python] view plain print?
#再执行下,就安装成功了!
>>> import lxml
>>>
3. 如用pip安装,常用命令就是:
pip install simplejson # 安装Python包
pip install --upgrade simplejson # 升级Python包
pip uninstall simplejson # 卸载Python包
4. 如用Eclipse+Pydev的开发方式,需要移除旧包,重新加载一次
Window --> Preferences --> PyDev --> Interperter-python # 否则导包的时候会报错
【Linux系统】
因为lxml依赖的包如下:
libxml2, libxml2-devel, libxlst, libxlst-devel, python-libxml2, python-libxslt
所以安装步骤如下:
第一步: 安装 libxml2
$ sudo apt-get install libxml2 libxml2-dev
第二步: 安装 libxslt
$ sudo apt-get install libxlst libxslt-dev
第三步: 安装 python-libxml2 和 python-libxslt
$ sudo apt-get install python-libxml2 python-libxslt
第四步: 安装 lxml
$ sudo easy_install lxml
⑸ python lxml etree怎么甩
lxml是Python语言中处理XML和HTML功能最丰富,最易于使用的库。
lxml是libxml2和libxslt两个C库的Python化绑定,它的独特之处在于兼顾了这些库的速度和功能完整性,同时还具有Python API的简介。兼容ElementTree API,但是比它更优越。
用libxml2编程就像是一个异于常人的陌生人的令人惊恐的拥抱,它看上去可以满足你一切疯狂的梦想,但是你的内心深处一直在警告你,你有可能会以最糟糕的方式遭殃,所以就有了lxml。
这是一个用lxml.etree来处理XML的教程,它简单的概述了ElementTree API的主要概念,同时有一些能让你的程序生涯更轻松的简单的提高。
首先是导入lxml.etree的方式:
fromlxmlimportetree
为了协助代码的可移植性,本教程中的例子很明显可以看出,一部分API是lxml.etree在ElementTree API(由Fredrik Lundh 的ElementTree库定义)的基础上的扩展。
Element是ElementTree API的主要容器类,大部分XML tree的功能都是通过这个类来实现的,Element的创建很容易:
root=etree.Element("root")
element的XML tag名通过tag属性来访问
>>>printroot.tag
root
许多Element被组织成一个XML树状结构,创建一个子element并添加进父element使用append方法:
>>>root.append(etree.Element("child1"))
还有一个更简短更有效的方法:the SubElement,它的参数和element一样,但是需要父element作为第一个参数:
>>>child2=etree.SubElement(root,"child2")
>>>child3=etree.SubElement(root,"child3")
可以序列化你创建的树:
>>>print(etree.tostring(root,pretty_print=True))
<root>
<child1/>
<child2/>
<child3/>
</root>
为了更方便直观的访问这些子节点,element模仿了正常的Python链:
>>>child=root[0]>>>print(child.tag)
child1
>>>print(len(root))
>>>root.index(root[1])#lxml.etreeonly!
>>>children=list(root)>>>forchildinroot:...print(child.tag)child1child2
child3
>>>root.insert(0,etree.Element("child0"))>>>start=root[:1]>>>end=root[-1:]>>>print(start[0].tag)child0>>>print(end[0].tag)child3
还可以根据element的真值看其是否有孩子节点:
ifroot:#thisnolongerworks!
print("Therootelementhaschildren")
用len(element)更直观,且不容易出错:
>>>print(etree.iselement(root))#testifit'ssomekindofElement
True
>>>iflen(root):#testifithaschildren
...print("Therootelementhaschildren")
Therootelementhaschildren
还有一个重要的特性,原文的句子只可意会,看例子应该是能看懂什么意思吧。
>>>forchildinroot:...print(child.tag)child0child1child2child3>>>root[0]=root[-1]#移动了element>>>forchildinroot:...print(child.tag)child3child1child2>>>l=[0,1,2,3]>>>l[0]=l[-1]>>>l[3,1,2,3]
>>>rootisroot[0].getparent()#lxml.etreeonly!.etree,'sstandardlibrary:>>>fromimportdeep>>>element=etree.Element("neu")>>>element.append(deep(root[1]))>>>print(element[0].tag)child1>>>print([c.tagforcinroot])['child3','child1','child2']
XML支持属性,创建方式如下:
>>>root=etree.Element("root",interesting="totally")
>>>etree.tostring(root)
b'<rootinteresting="totally"/>'
属性是无序的键值对,所以可以用element类似于字典接口的方式处理:
>>>print(root.get("interesting"))
totally
>>>print(root.get("hello"))
None
>>>root.set("hello","Huhu")
>>>print(root.get("hello"))
Huhu
>>>etree.tostring(root)
b'<rootinteresting="totally"hello="Huhu"/>'
>>>sorted(root.keys())
['hello','interesting']
>>>forname,valueinsorted(root.items()):
...print('%s=%r'%(name,value))
hello='Huhu'
interesting='totally'
如果需要获得一个类似dict的对象,可以使用attrib属性:
>>>attributes=root.attrib
>>>print(attributes["interesting"])
totally
>>>print(attributes.get("no-such-attribute"))
None
>>>attributes["hello"]="GutenTag"
>>>print(attributes["hello"])
GutenTag
>>>print(root.get("hello"))
GutenTag
既然attrib是element本身支持的类似dict的对象,这就意味着任何对element的改变都会影响attrib,反之亦然。这还意味着只要element的任何一个attrib还在使用,XML树就一直在内存中。通过如下方法,可以获得一个独立于XML树的attrib的快照:
>>>d=dict(root.attrib)
>>>sorted(d.items())
[('hello','GutenTag'),('interesting','totally')]
⑹ python中lxml模块怎么导入
这个模块是第三方模块,需要先安装再导入。
安装:终端命令界面下,pip install lxml(安装过程中如果提示需要其他哪个库,需要先装提示的库,再装lxml)。
如果使用pip安装失败,到pypi社区官网下载压缩包解压,终端界面进入其目录(当前目录有个叫“setup.py”就对了),用命令 python setup install 就行。
导入:import lxml 即可
⑺ python使用xpath(超详细)
使用时先安装 lxml 包
开始使用 #
和beautifulsoup类似,首先我们需要得到一个文档树
把文本转换成一个文档树对象
from lxml import etreeif __name__ == '__main__':doc='''
把文件转换成一个文档树对象
fromlxmlimportetree# 读取外部文件 index.htmlhtml = etree.parse('./index.html')result = etree.tostring(html, pretty_print=True)#pretty_print=True 会格式化输出print(result)
均会打印出文碧态档内容
节点、元素、属性、内容 #
xpath 的思想是通过 路径表达 去寻找节点。节点包括元素,属性,和内容
元素举例
html --->...div --->
这里我们可以看到,这里的元素和html中的标签一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用
路径表达式 #
/ 根节点,节点分隔符,// 任意位置. 当前节点.. 父级节点@ 属性
通配符 #
* 任意元素@* 任意属性node() 任意子节点(元素,属性,内悔老源容)
谓语 #
使用中括号来限定元素,称为谓语
//a[n] n为大于零的整数,代表子元素排在第n个位置的 元素//a[last()] last() 代表子元素排在最后个位置的 元素//a[last()-] 和上面同理,代表倒数第二个//a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始//a[@href] 拥有href的 元素//a[@href='www..com'] href属性值为'www..com'的 元素//book[@price>2] price值大于2的元素
多个路含蠢径 #
用| 连接两个表达式,可以进行 或匹配
//book/title | //book/price
函数 #
xpath内置很多函数。更多函数查看 https://www.w3school.com.cn/xpath/xpath_functions.asp
contains(string1,string2)
starts-with(string1,string2)
ends-with(string1,string2) #不支持
upper-case(string) #不支持
text()
last()
position()
node()
可以看到last()也是个函数,在前面我们在谓语中已经提到过了
案例 #
定位元素 #
匹配多个元素,返回列表
fromlxmlimportetreeif__name__ =='__main__':doc='''
【结果为】
[<Element li at 0x2b41b749848>, <Element li at 0x2b41b749808>, <Element li at 0x2b41b749908>, <Element li at 0x2b41b749948>, <Element li at 0x2b41b749988>][] #没找到p元素
html = etree.HTML(doc)print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0]))print(html.xpath("//li[@class='item-inactive']")[0].text)print(html.xpath("//li[@class='item-inactive']/a")[0].text)print(html.xpath("//li[@class='item-inactive']/a/text()"))print(html.xpath("//li[@class='item-inactive']/.."))print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))
【结果为】
b' third item \n 'None #因为第三个li下面没有直接text,Nonethird item #['third item'][<Element ul at 0x19cd8c4c848>][<Element li at 0x15ea3c5b848>, <Element li at 0x15ea3c5b6c8>]
使用函数 #
contains #
有的时候,class作为选择条件的时候不合适@class='....' 这个是完全匹配,当王爷样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便
from lxml import etreeif __name__ == '__main__':doc='''
【结果为】
[<Element p at 0x23f4a9d12c8>, <Element li at 0x23f4a9d13c8>, <Element li at 0x23f4a9d1408>, <Element li at 0x23f4a9d1448>, <Element li at 0x23f4a9d1488>]
starts-with #
from lxml import etreeif __name__ == '__main__':doc='''
【结果为】
[<Element ul at 0x23384e51148>, <Element p at 0x23384e51248>, <Element li at 0x23384e51288>, <Element li at 0x23384e512c8>, <Element li at 0x23384e51308>, <Element li at 0x23384e51388>][<Element ul at 0x23384e51148>]
ends-with #
print(html.xpath("//*[ends-with(@class,'ul')]"))
【结果为】
Traceback (most recent call last):File"F:/OneDrive/pprojects/shoes-show-spider/test/xp5_test.py",line18,inprint(html.xpath("//*[ends-with(@class,'ul')]"))File"src\lxml\etree.pyx",line1582,inlxml.etree._Element.xpathFile"src\lxml\xpath.pxi",line305,inlxml.etree.XPathElementEvaluator.__call__File"src\lxml\xpath.pxi",line225,inlxml.etree._XPathEvaluatorBase._handle_resultlxml.etree.XPathEvalError: Unregisteredfunction
看来python的lxml并不支持有的xpath函数列表
upper-case #
和ends-with函数一样,也不支持。同样报错lxml.etree.XPathEvalError: Unregistered function
print(html.xpath("//a[contains(upper-case(@class),'ITEM-INACTIVE')]"))
text、last #
#最后一个li被限定了print(html.xpath("//li[last()]/a/text()"))#会得到所有的`<a>`元素的内容,因为每个<a>标签都是各自父元素的最后一个元素。#本来每个li就只有一个<a>子元素,所以都是最后一个print(html.xpath("//li/a[last()]/text()"))print(html.xpath("//li/a[contains(text(),'third')]"))
【结果为】
['fifth item']['second item', 'third item', 'fourth item', 'fifth item'][<Element a at 0x26ab7bd1308>]
position #
print(html.xpath("//li[position()=2]/a/text()"))#结果为['third item']
上面这个例子我们之前以及讲解过了
* 这里有个疑问,就是position()函数能不能像text()那样用呢
print(html.xpath("//li[last()]/a/position()"))#结果 lxml.etree.XPathEvalError: Unregisteredfunction
这里我们得到一个结论,函数不是随意放在哪里都能得到自己想要的结果
node #
返回所有子节点,不管这个子节点是什么类型(熟悉,元素,内容)
print(html.xpath("//ul/li[@class='item-inactive']/node()"))print(html.xpath("//ul/node()"))
【结果为】
[]['\n ', , '\n ', , '\n ', , '\n ', , '\n ', , ' 闭合标签\n ']
获取内容 #
**刚刚已经提到过,可以使用.text和text()的方式来获取元素的内容
from lxml import etreeif __name__ == '__main__':doc='''
【结果为】
['first item','second item','third item','fourth item','fifth item']first item18['\n ','\n ','\n ','\n ','\n ',' 闭合标签\n ']
看到这里,我们观察到text()和.text的区别。自己总结吧。不太好表达,就不表达了
获取属性 #
print(html.xpath("//a/@href"))print(html.xpath("//li/@class"))
【结果为】
['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']['item-0active', 'item-1', 'item-inactive', 'item-1', 'item-0']
自定义函数 #
我们从使用函数的过程中得到结论,就是有的函数不支持,有的支持,那问题来了,到底那些方法支持呢。我们在lxml官网找到了答案。 https://lxml.de/xpathxslt.html 。lxml 支持XPath 1.0 ,想使用其他扩展,使用libxml2,和libxslt的标准兼容的方式。 XPath 1.0官方文档 以及其他版本的XPath文档 https://www.w3.org/TR/xpath/
lxml supports XPath1.0, XSLT1.0andthe EXSLT extensions through libxml2andlibxsltina standards compliant way.
除此之外,lxml还提供了自定义函数的方式来扩展xpath的支持度 https://lxml.de/extensions.html
from lxml import etree#定义函数def ends_with(context,s1,s2):return s1[0].endswith(s2)if __name__ == '__main__':doc='''
【结果为】
[<Element li at 0x2816ed30548>, <Element li at 0x2816ed30508>]['first item', 'third item']
形参s1会传入xpath中的第一个参数@class,但这里注意@class是个列表
形参s2会传入xpath中的第二个参数'active','active'是个字符串
官网例子 https://lxml.de/extensions.html
defhello(context, a):return"Hello %s"% afromlxmlimportetreens = etree.FunctionNamespace(None)ns['hello'] = helloroot = etree.XML('<a><b>Haegar</b></a>')print(root.xpath("hello('Dr. Falken')"))# 结果为 Hello Dr. Falken
⑻ Python3.10版 Win1064位无法安装lxml库
在练习xpath时,需要安装lxml模块,报错需要 Microsoft Visual C++ 14.0 吐槽一些教程:pip install wheel,安装无效果的 环境 window 10 python3 重装系统后,安装了最新的Python3.8.1,当使用pip安装lxml库的时候报错Microsoft Visual C++ 14.0 is required,
前提是:1.已安装python,2. 已安装好pip,3.已将python安装目录下的scripts目录(如D:\Python35\Scripts)添加到系统环境变量path里。
方法一:打开cmd,输入pip install lxml。如果安装成功的话,可以不用往下看了,人品太好了。通常呢,都会遇到各种错误,不是这不对,就是那里错,反正就是各种安装不了。
方绝蚂含法二:基本上,进到这里来看的人,应该都是已经掉到坑里的,所以直接从这里看起就可以。推并笑荐通过物宴lxml的.whl文件来进行安装。