# -*- 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)