目录
网页数据解析与爬取----pyquery
pyquery 使用
1、准备工作
pyquery安装
pip install pyquery
2、初始化
使用pyquery库解析HTML文本时,需要先将其初始化一个PyQuery对象
1、字符串初始化
这种方式直接把HTML的内容当做初始化参数,来初始化PyQuery对象
# 导入模块,起别名为pq
from pyquery import PyQuery as pq
# 将HTML字符串当作参数传递给PyQuery类,完成初始化
doc = pq(html)
print(doc('li'))
2、URL 初始化
初始化参数除了能以字符串形式传递外,还能使用网页的URL,只需指定PyQuery对象的参数为URL即可
from pyquery import PyQuery as pq
# PyQuery对象会先请求URL,然后用得到的html内容完成初始化(将网页源代码以字符串形式传递给PyQuery类,从而完成初始化操作)
doc = pq(url="https://www.baidu.com")
# 与上一行代码等价
doc = pq(requests.get(url="https://www.baidu.com").text)
print(doc('title'))
3、文件 初始化
传递本地文件名,进行初始化,此时将参数指定为filename
from pyquery import PyQuery as pq
doc = pq(filename="demo.html")
print(doc('title'))
3、基本CSS选择器
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
# 获取节点文本内容
for item in doc('#container .list li').items():
print(item.text())
4、查找节点
1、查找子节点
使用find方法,参数是CSS选择器
from pyquery import PyQuery as pq
doc = pq(html)
item = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)
# find方法的查找范围是节点的所有子孙节点,如果只是查找子节点,可用children方法
lis = items.children()
print(type(lis))
print(lis)
# 如果要筛选所有子节点中符合条件的节点,例如筛选出子节点中class为active的节点,则可向children方法传入CSS选择器.active
lis = items.children('.active')
print(lis)
2、父节点
使用parent方法获取某个节点的直接父节点
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)
使用parents方法获取某个节点的祖先节点
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)
3、兄弟节点
使用siblings方法获取
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())
5、节点操作
pyquery库提供了一系列方法对节点进行动态修改,例如移除某个节点等,这些操作会为提取信息带来极大的便利
1、addClass 和 removeClass
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)
addClass和removeClass方法可动态改变节点的class属性
2、attr、text 和 html
使用attr对属性进行操作,使用text和html方法可用来改变节点内部的内容
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('change item')
print(li)
li.html('<span>change item</span>')
print(li)
3、remove
remove方法作用是移除,有时会为信息的提取带来极大便利
html = """
<div class="wrap">
hello world
<P>this is a paragraph.</p>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text()) # 结果:hello world this is paragraph
wrap.fing('p').remove()
print(wrap.text()) # hello world
6、伪类选择器
CSS选择器支持多种多样的伪类选择器,例如选择第一个节点,选择最后一个节点,奇偶数节点,包含某文本的节点等
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)