pyquery是python界的jquery,用于解析html,用法跟jquery极其类似。
有多种方法:
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格式上能做到合情合理。