爬虫基础 pyquery 详解



# -*- coding:utf8 -*-
# 工程路径:pyquery详解.py
# 工程日期:10/6/2019
# 工程目标:pyquery的使用

#%% 使用pyquery解析网页元素
html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))
print(type(doc('li'))) # 是个pq的对象 # 基于CSS选择器选择元素


#%% URL的直接初始化
from pyquery import PyQuery as pq
doc = pq(url='https://www.baidu.com')
print(doc('head'))

#%% 基于文件的初始化
# 以文件的形式加载网页内容
from pyquery import PyQuery as pq
doc = pq(filename='文件路径')
print(doc())

#%% 基本的css选择器
# css选择器中使用嵌套模式,并不一定是直接子对象,具有层级关系,就可以使用嵌套选择
html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))  # 选出所有的li 标签
# # 标识的为 id .
# . 标识 class
#  空格标识嵌套关系


#%% 查找元素
# 子元素的选择 find
html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
item = doc('.list')
print(item)  # 查找所有的 li 标签
print(type(item))  # 查看返回的 item 类型 是pyquery对象类型
lis = item.find('li')
print(lis)
print(doc.find('a'))  # 查找a标签
# 该类型的对象任然可以进行迭代查找

#%% 获取父元素, 兄弟元素, 子元素
html = """
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
"""

from pyquery import PyQuery as pq
doc = pq(html)
item = doc('.list')
container_p = item.parent() # 查找 属性为 list 的标签的 父标签
container_ps = item.parents() # 查找属性为 list 标签的 祖先节点
container_s = item.children() # 查找该标签的所有子孙节点
container_si = doc('.list .item.active').siblings()  # 查找 属性为 list 的内层中的 包含item和active 属性的节点的兄弟节点
print(container_s)
print(container_ps)
print(container_s)
print(container_si)

#%% 遍历元素
# 遍历多个元素 .items (遍历结果中的多个元素)
html = """
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
"""

from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()
for i in lis:
    print(i)


#%% 获取标签的属性信息, 标签内容的文本信息
html = """
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
"""

from pyquery import PyQuery as pq
doc = pq(html)
print(doc('.item-0.active a').attr('href')) # 获取class 为 item-0 active 的子标签 a 标签的中的 href 值
print(doc('.item-0.active a').text())   # 获取该标签中的文本内容
print(doc('.item-0.active').html())  # 获取该标签内层的HTML内容


#%% dom 节点操作
# addclass removeclass  添加删除class中的属性
# attr 在class 中 添加属性
# css  在标签中添加样式
# remove 一出指定标签的标识符 <>
# 其他方法http://pyquery.readthedocs.io/en/latest/api.html


#%%  伪类选择器 符合css3的选择器标准
html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')   # 获取 li 标签的第一个
print(li)
li = doc('li:last-child')    # 获取 li 标签的 最后一个
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')  # 获取 02468 的li 标签
print(li)
li = doc('li:contains(second)')  # 获取内容包含 second 的 li 标签
print(li)
posted @ 2019-06-10 13:11  binyang  阅读(289)  评论(0编辑  收藏  举报