pyquery网页解析库
同样的,是网页解析的前提是成功访问网页,能够获取到内容,之后再是解析。
from pyquery import PyQuery as pq
以下面一段html为例
html = '''
- first item
- second item
- third item
- fourth item
- fifth item
'''
doc = pq(html) #字符串初始化
print(doc('li')) #CSS选择器
from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com') #直接请求链接
print(doc('head'))
这里仅举例:
doc = pq(filename='demo.html')
print(doc('li'))
同样是解析完网页后进行选择,PyQuery和BeautifulSoup的选择形式稍微有些不同。
BeautifulSoup是,见上篇:
使用标签器 对象.
使用标准选择器 对象.find_all( ) 或 对象.find( )
使用CSS选择器 对象.select( )
PyQuery是:对象(‘需要选择的内容’)
doc = pq(html)
print(doc('#container .list li')) #不一定是严格的父节点与子节点关系
这里选择的是属性id是container, 属性calss是list, 节点名是li的节点。
是全部都会选出来,不会默认只选第一个(比较BeautifulSoup)
doc = pq(html)
items = doc('.list') #找出class=list的节点
print(type(items),'\n')
print(items,'\n')
#找出上个节点里,名称为li的节点(全部):
print('找出上个节点里,名称为li的节点(全部):','\n')
lis = items.find('li')
print(type(lis))
print(lis)
#找li节点,或者
# print(doc('.list li'))
#还或者
# print(items.children())
lis = items.children('.active')
print(lis)
注意这里被没有写全class属性,因为整段html中,class属性值包含’active’的不多,可以选出来。如果有class='active’的节点,那就选不出来上面的结果了。
选父节点的形式和BeautifulSoup一样
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)
选出来它的上一层父节点(最开始的这段html也只有一个父节点)。
如果再往外嵌套一个节点,如:
html = '''
- first item
- second item
- third item
- fourth item
- fifth item
'''
那么会输出2个,分别是上一层父节点,和上上一层父节点(全部的父节点)。
以紧邻的上段html为例:
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())
doc = pq(html)
li = doc('.list .item-0.active')
#这里.item-0.active中间没有空格,表示是并列关系,class含有这两个属性的选出来
print(li.siblings('.active'))
也即用循环,遍历选出内嵌的子节点
doc = pq(html)
lis = doc('li').items() #使用items进行遍历
print(type(lis))
for li in lis:
print(li('a'))
注意PyQuery中使用 .items先选定节点内容,再往下遍历。
对象(’ ')或 对象.
doc = pq(html)
a = doc('.item-0.active a') #这里.item-0.active中间没有空格,表示是并列关系,class含有这两个属性的选出来
print(a)
print(a.attr('href'))
print(a.attr.href)
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print('remove active之后:','\n',li)
li.addClass('active')
print('add active之后:','\n',li)
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link') #在属性attr中添加name
print('属性attr添加了name后:','\n',li)
li.css('font-size', '14px') #在属性attr中添加格式style
print('属性attr添加了style后','\n',li)
html = '''
Hello, World
This is a paragraph.
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print('wrap节点的全部text:','\n',wrap.text())
print('\n')
wrap.find('p').remove()
print('删除一个子节点后的text:',wrap.text())
html = '''
- first item
- second item
- third item
- fourth item
- fifth item
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)
更多CSS选择器内容
官方文档