python解析html开发库pyquery使用方法

1157次阅读  |  发布于5年以前

例如

复制代码 代码如下:

导演: 汤姆・提克威 / 拉娜・沃卓斯基 / 安迪・沃卓斯基
编剧: 汤姆・提克威 / 安迪・沃卓斯基 / 拉娜・沃卓斯基
主演: 汤姆・汉克斯 / 哈莉・贝瑞 / 吉姆・布劳德本特 / 雨果・维文 / 吉姆・斯特吉斯 / 裴斗娜 / 本・卫肖 / 詹姆斯・达西 / 周迅 / 凯斯・大卫 / 大卫・吉雅西 / 苏珊・萨兰登 / 休・格兰特
类型: 剧情 / 科幻 / 悬疑
官方网站: cloudatlas.warnerbros.com
制片国家/地区: 德国 / 美国 / 香港 / 新加坡
语言: 英语
上映日期: 2013-01-31(中国大陆) / 2012-10-26(美国)
片长: 134分钟(中国大陆) / 172分钟(美国)
IMDb链接: tt1371111
官方小站: 电影《云图》

复制代码 代码如下:

from pyquery import PyQuery as pq
doc=pq(url='http://movie.douban.com/subject/3530403/')
data=doc('.pl')
for i in data:
print pq(i).text()

输出

复制代码 代码如下:

导演
编剧
主演
类型:
官方网站:
制片国家/地区:
语言:
上映日期:
片长:
IMDb链接:
官方小站:

用法

用户可以使用PyQuery类从字符串、lxml对象、文件或者url来加载xml文档:

复制代码 代码如下:

from pyquery import PyQuery as pq
from lxml import etree
doc=pq("")
doc=pq(etree.fromstring(""))
doc=pq(filename=path_to_html_file)
doc=pq(url='http://movie.douban.com/subject/3530403/')

可以像jQuery一样选择对象了

复制代码 代码如下:

doc('.pl')
[<span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span#rateword.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <span.pl>, <p.pl>]

这样,class为'pl'的对象就全部选择出来了。

不过在使用迭代时需要对文本进行重新封装:

复制代码 代码如下:

for para in doc('.pl'):
para=pq(para)
print para.text()
导演
编剧
主演
类型:
官方网站:
制片国家/地区:
语言:
上映日期:
片长:
IMDb链接:
官方小站:

这里得到的text是unicode码,如果要写入文件需要编码为字符串。
用户可以使用jquery提供的一些伪类(但还不支持css)来进行操作,诸如:

复制代码 代码如下:

doc('.pl:first')
[<span.pl>]
print doc('.pl:first').text()
导演

Attributes
获取html元素的属性

复制代码 代码如下:

p=pq('

')('p')
p.attr('id')
'hello'
p.attr.id
'hello'
p.attr['id']
'hello'

赋值

复制代码 代码如下:

p.attr.id='plop'
p.attr.id
'plop'
p.attr['id']='ola'
p.attr.id
'ola'
p.attr(id='hello',class_='hello2')
[<p#hello.hell0>]

Traversing
过滤

复制代码 代码如下:

d=pq('

hello

world

')
d('p').filter('.hello')
[<p#hello.hello>]
d('p').filter('#test')
[<p#test>]
d('p').filter(lambda i:i==1)
[<p#test>]
d('p').filter(lambda i:i==0)
[<p#hello.hello>]
d('p').filter(lambda i:pq(this).text()=='hello')
[<p#hello.hello>]

按照顺序选择

复制代码 代码如下:

d('p').eq(0)
[<p#hello.hello>]
d('p').eq(1)
[<p#test>]

选择内嵌元素

复制代码 代码如下:

d('p').eq(1).find('a')
[
]

选择父元素

复制代码 代码如下:

d=pq('

Whoah!

there

')
d('p').eq(1).find('em')
[]
d('p').eq(1).find('em').end()
[

]
d('p').eq(1).find('em').end().text()
'there'
d('p').eq(1).find('em').end().end()
[

,

]