Python中类似于jquery的pyquery库用法分析
本文实例讲述了Python中类似于jquery的pyquery库用法。分享给大家供大家参考,具体如下:
pyquery:一个类似于jquery的Python库
pyquery可以使你在xml文档上做jquery查询,它的API尽可能地类似于jquery。pyquery使用lxml执行快速的xml和html操作。
这并非(至少目前还不是)一个生成javascript代码或者与javascript代码做交互的库。pyquery的作者只是由于非常喜欢jquery的API因而将其用python实现。
该项目目前托管在Github仓库中并且处于活跃开发状态。作者可以为任何想要贡献源码的开发者赋予push权限,并且会对其做的变更做回顾。如果你想要贡献源码,可以发Email给项目作者。
项目的Bug可以通过GithubIssueTracker进行提交。
快速入门
你可以使用PyQuery类从一个字符串,一个lxml文档,一个文件或者一个url钟载入一个xml文档:
>>>frompyqueryimportPyQueryaspq
>>>fromlxmlimportetree
>>>importurllib
>>>d=pq("")
>>>d=pq(etree.fromstring(""))
>>>d=pq(url=your_url)
>>>d=pq(url=your_url,
...opener=lambdaurl,**kw:urlopen(url).read())
>>>d=pq(filename=path_to_html_file)
现在,d就相当于jquery里的$:
>>>d("#hello")
[]
>>>p=d("#hello")
>>>print(p.html())
Helloworld!
>>>p.html("youknowPythonrocks")
[]
>>>print(p.html())
youknowPythonrocks
>>>print(p.text())
youknowPythonrocks
你也可以使用某些jQuery中可用而并非css标准的伪类,诸如:first:last:even:odd:eq:lt:gt:checked:selected:file:等
>>>d('p:first')
[]
参见http://pyquery.rtfd.org/查看全部文档
CSS
你可以像这样添加、切换、移除CSS:
>>>p.addClass("toto")
[]
>>>p.toggleClass("tititoto")
[
]
>>>p.removeClass("titi")
[
]
或者操作CSS样式:
>>>p.css("font-size","15px")
[]
>>>p.attr("style")
'font-size:15px'
>>>p.css({"font-size":"17px"})
[
]
>>>p.attr("style")
'font-size:17px'
使用更加Pythonic的方式完成同样的功能(‘_'字符转换为‘-‘):
>>>p.css.font_size="16px" >>>p.attr.style 'font-size:16px' >>>p.css['font-size']="15px" >>>p.attr.style 'font-size:15px' >>>p.css(font_size="16px") [] >>>p.attr.style 'font-size:16px' >>>p.css={"font-size":"17px"} >>>p.attr.style 'font-size:17px'
使用伪类:
- :button
匹配所有按钮输入元素和按钮元素Matchesallbuttoninputelementsandthebuttonelement
- :checkbox
匹配所有复选框输入元素Matchesallcheckboxinputelements
- :checked
匹配选中的元素,下标从0开始Matchesoddelements,zero-indexed
- :child
右边是左边的直接子元素rightisanimmediatechildofleft
- :contains()
包含元素Matchesallelementsthatcontainthegiventext
- :descendant
右边是左边的子元素、孙元素或者更远的后继元素rightisachild,grand-childorfurtherdescendantofleft
- :disabled
匹配所有被禁用的元素Matchesallelementsthataredisabled
- :empty
匹配所有不包括任何其他元素的元素Matchallelementsthatdonotcontainotherelements
- :enabled
匹配所有启用的元素Matchesallelementsthatareenabled
- :eq()
使用下标匹配Matchesasingleelementbyitsindex
- :even
从下标0开始,匹配所有偶数元素Matchesevenelements,zero-indexed
- :file
匹配所有文件类型的输入元素Matchesallinputelementsoftypefile
- :first
匹配第一个被选择的元素Matchesthefirstselectedelement
- :gt()
匹配下标大于指定值的元素Matchesallelementswithanindexoverthegivenone
- :header
匹配所有标题元素Matchesallheaderelelements(h1,...,h6)
- :image
匹配所有图像输入元素Matchesallimageinputelements
- :input
匹配所有输入元素Matchesallinputelements
- :last
匹配最后一个选择的元素Matchesthelastselectedelement
- :lt()
匹配所有下标小于指定值的元素Matchesallelementswithanindexbelowthegivenone
- :odd
匹配奇元素,下标从0开始Matchesoddelements,zero-indexed
- :parent
匹配所有包含其他元素的元素Matchallelementsthatcontainotherelements
- :password
匹配所有密码输入元素Matchesallpasswordinputelements
- :radio
匹配单选按钮输入元素Matchesallradioinputelements
- :reset
匹配所有重置输入元素Matchesallresetinputelements
- :selected
匹配所有被选中的元素Matchesallelementsthatareselected
- :submit
匹配所有提交输入元素Matchesallsubmitinputelements
- :text¶
匹配所有文本输入元素Matchesalltextinputelements
操作
你也可以向标签的尾部追加元素:
>>>d=pq('youknowPythonrocks')
>>>d('p').append('checkoutreddit')
[]
>>>print(d)
youknowPythonrockscheckoutreddit
或者加至开头:
>>>p=d('p')
>>>p.prepend('checkoutreddit')
[]
>>>print(p.html())
checkoutreddityouknow...
在其他元素之前或者之后追加元素:
>>>d=pq('python! ]
>>>print(d('#test').html())
在其他元素之后插入元素: ]
>>>print(d('#test').html())
或者插入其他元素之前: ]
>>>print(d('body').html())
对每个元素做一些事情: ]
移除一个元素:
>>>p.insertAfter(d('#test'))
[
>>>p.insertBefore(d('#test'))
[
>>>p.each(lambdai,e:pq(e).addClass('hello2'))
[
>>>d=pq('
pythonrocks!
移除选中元素的内容:
>>>d('p').empty()
[]
你可以获得修改后的html内容:
>>>print(d)
你可以生成html片段:
>>>frompyqueryimportPyQueryaspq
>>>print(pq('Yeah!').addClass('myclass')+pq('cool'))
Yeah!