pyquery:python里的jquery

pyquery是python界的jquery,用于解析html,用法跟jquery极其类似。

打开一个html

有多种方法:

from pyquery import PyQuery as pq
d = pq("<html></html>")
d = pq(url=your_url)
d = pq(filename=path_to_html_file)

常见用法罗列

d('img')
d('img').eq(3).attr('src')
d('p:first').text()
d('p:eq(1)').text()
d('div.well form#my_comment_form')
d('div.well form#my_comment_form').parent()
d('div.well form#my_comment_form').parents()
d('img').replaceWith('<img src="xxx">')

总之,jquery的多数使用,pyquery都能支持。对节点的操作如append() prepend() remove()都是支持的,但是感觉对于服务端来说意义不是特别大,服务端更多的是抓取解析之类的活儿。由于python推荐小写加下划线的函数命名,而JQuery使用骆峰方式命名,所以outerHtml()和outer_html()可同时使用。

特别注意,pyquery内部使用unicode编码,所以传入的字符串需要转成unicode,否则会乱码:

d = pq(data.decode('utf8'))
data = d.html().encode('utf8')

列表也需要使用特定方法遍历:

[pq(i).attr('src') for i in d('img')]
d('img').map(lambda i,e: pq(e).attr('src'))

还有.each() .filter()等对列表进行遍历操作。

错误写法:

d('img')[0].attr('src')

格式修正

pyquery还有一个强大的用处,就是对html进行格式修正,否则自己写递归压栈,会很伤神。

pq('<p>abc</p><p>def</p>').outer_html()
u'<div><p>abc</p><p>def</p></div>'

默认pyquery会将输入转成一个节点,如果发现是多个节点,就用div包起来。

pq('<p>abc</p><p>def').outer_html()
u'<div><p>abc</p><p>def</p></div>'

pq('<p>abc</p>def</p>').outer_html()
u'<div><p>abc</p>def</div>'

pq('<div><p>abc</p><p>def').outer_html()
u'<div><p>abc</p><p>def</p></div>'

从例子可见,pyquery在修正html格式上能做到合情合理。

发表于 2016年08月25日 15:08   评论:0   阅读:2413  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo