042010
 

PyQuery是一个类似于jQuery的Python库,也可以说是jQuery在Python上的实现。pyQuery是使用lxml来实现快速的xml和html操作的。具体的PyQuery文档见:http://pyquery.org/

用这个来做蜘蛛爬数据的时候分析html并从中提取数据还是很爽的。

废话不多说,直接看一点简单的例子吧:

>>> from pyquery import PyQuery as pq

>>> d = pq("<html></html>") #可以直接拼HTML

>>> d = pq(url='http://www.powereasy.net/') #也可以打开一个url

>>> d('title') #取title元素

[<title>]

>>> print d('title').text()

动易网络 – 领先的内容管理系统(CMS)、企业级电子商务平台(B2C)和站群管理系统(SiteGroup)提供商

>>> print d("#logo").html() #根据ID获取元素

<a href="http://www.powereasy.net" title="&#x52A8;&#x6613;&#x7F51;&#x7EDC;">官方主站</a>

>>> d('.s') #根据类名获取元素

[<li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>]

>>> a = d('#topNavIn li:eq(5)').find('a') #复杂点的选择器也是可以的,看来支持的不错

>>> a.attr('href') #属性操作

'http://sms.powereasy.net/'

>>> a.attr('href', 'http://qleelulu.cnblogs.com').attr('href') #修改属性值

'http://qleelulu.cnblogs.com'

>>> d('#LoginFrom').hasClass('Login_ajax') #css类操作

True

>>> d('#LoginFrom').addClass('lulu').attr('class') #css类操作

'lulu Login_ajax'

>>>

addClass(value)

给元素添加css类:

>>> d = PyQuery('<div></div>')

>>> d.addClass('myclass')

[<div.myclass>]

after(value)

给节点添加值

append(value)

给每个节点添加值

appendTo(value)

给值添加节点

attr

支持set/get/del 属性,类似javascript样式。

base_url

返回当前html文档的url,如果不存在则返回None。

before(value)

在节点前插入值

clone()

css

支持 set/get/del 属性,类似javascript样式。

each(func)

给每个节点添加func。

empty()

删除节点内容。

end()

退出当前转换并返回上一层。

>>> m = '<p><span><em>Whoah!</em></span></p><p><em> there</em></p>'

>>> d = PyQuery(m)

>>> d('p').eq(1).find('em').end().end()

[<p>, <p>]

eq(index)

返回被检索的元素。

>>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p><div></div>')

>>> d('p').eq(0)

[<p.hello>]

>>> d('p').eq(1)

[<p>]

filter(selector)

运用(字符串或者函数)进行过滤.

>>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p>')

>>> d('p')

[<p.hello>, <p>]

>>> d('p').filter('.hello')

[<p.hello>]

>>> d('p').filter(lambda i: i == 1)

[<p>]

>>> d('p').filter(lambda i: PyQuery(this).text() == 'Hi')

[<p.hello>]

find(selector)

运用选择器来对元素进行查找。

>>> m = '<p><span><em>Whoah!</em></span></p><p><em> there</em></p>'

>>> d = PyQuery(m)

>>> d('p').find('em')

[<em>, <em>]

>>> d('p').eq(1).find('em')

[<em>]

hasClass(name)

如果拥有该class则返回True:

>>> d = PyQuery('<div class="myclass"></div>')

>>> d.hasClass('myclass')

True

height(value=<NoDefault>)

设置或获取元素的高度值

hide()

给display添加none于元素样式

html(value=<NoDefault>)

设置或者获取子节点html的表达方法。

获取文本值:

>>> doc = PyQuery('<div><span>toto</span></div>')

>>> print doc.html()

<span>toto</span>

设置文本值:

>>> doc.html('<span>Youhou !</span>')

[<div>]

>>> print doc

<div><span>Youhou !</span></div>

insertAfter(value)

在值后面添加节点

insertBefore(value)

在值前添加节点

is_(selector)

如果选择器符合当前元素则返回True,否则返回False。

>>> d = PyQuery(‘<p class=”hello”>Hi</p><p>Bye</p><div></div>’) >>> d(‘p’).eq(0).is_(‘.hello’) True >>> d(‘p’).eq(1).is_(‘.hello’) False

make_links_absolute(base_url=None)

生成绝对链接。

map(func)

当用户完成转换后,返回一个新的PyQuery对象。

func 需要两个参数 – ‘index’ 和 ‘element’. 在func里面,元素可以用 ‘this’代替。

>>> d = PyQuery('<p class="hello">Hi there</p><p>Bye</p><br />')

>>> d('p').map(lambda i, e: PyQuery(e).text())

['Hi there', 'Bye']

>>> d('p').map(lambda i, e: len(PyQuery(this).text()))

[8, 3]

>>> d('p').map(lambda i, e: PyQuery(this).text().split())

['Hi', 'there', 'Bye']

not_(selector)

返回不符合选择器的元素。

>>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p><div></div>')

>>> d('p').not_('.hello')

[<p>]

prepend(value)

给节点前附加一个值

prependTo(value)

给值前附加一个节点。

remove(expr=<NoDefault>)

删除节点。

removeAttr(name)

删除一个属性:

>>> d = PyQuery('<div id="myid"></div>')

>>> d.removeAttr('id')

[<div>]

removeClass(value)

删除一个元素的css类

>>> d = PyQuery('<div class="myclass"></div>')

>>> d.removeClass('myclass')

[<div>]

replaceAll(expr)

用表达式替换节点。

replaceWith(value)

用值替换节点。

show()

将元素的display属性更变为block。

text(value=<NoDefault>)

设置或者获得子元素的文本。

获得文本值:

>>> doc = PyQuery('<div><span>toto</span><span>tata</span></div>')

>>> print doc.text()

toto tata

设置文本值:

>>> doc.text('Youhou !')

[<div>]

>>> print doc

<div>Youhou !</div>

toggleClass(value)

开关元素的某个css类

>>> d = PyQuery('<div></div>')

>>> d.toggleClass('myclass')

[<div.myclass>]

val(value=<NoDefault>)

设置或者获得元素值:

>>> d = PyQuery('<input />')

>>> d.val('Youhou')

[<input>] >>> d.val() ‘Youhou’

width(value=<NoDefault>)

set/get width of element

wrap(value)

每个对象将实时添加HTML字符串:

>>> d = PyQuery('<span>youhou</span>')

>>> d.wrap('<div></div>')

[<div>]

>>> print d

<div><span>youhou</span></div>

wrapAll(value)

将所有的元素包装到一个元素中:

>>> d = PyQuery('<div><span>Hey</span><span>you !</span></div>')

>>> print d('span').wrapAll('<div id="wrapper"></div>')

<div id=”wrapper”><span>Hey</span><span>you !</span></div>

  One Response to “用PyQuery来抓取网页,后附PyQuery API”

  1. 主题背景色有点深,看不清字可以考虑 ‘Crtl + A’ 试试

 Leave a Reply

(必须填写)

(必须填写,邮件地址不会被泄露)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>