爬虫之解析库pyquery
初始化
安装: pip install pyquery
字符串的形式初始化
html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1">Python</li> <li class="object-2">大法</li> <li class="object-3">好</li> </ul> </body> </html> """
doc = pq(html) print(doc("title")) <title>PyQuery</title>
URL初始化
# PyQuery对象首先会请求这个url,用得到的HTML内容完成初始化 doc = pq(url="https://www.cnblogs.com/songzhixue/") print(doc("title")) <title>村里唯一的架构师 - 博客园</title> doc = pq(requests.get("https://www.cnblogs.com/songzhixue/").text) print(doc("title")) <title>村里唯一的架构师 - 博客园</title> # 两种方法相同
文件初始化
# 读取本地的html文件以字符串的形式传递给PyQuery类来初始 化 doc = pq(filename="demo.html") # demo.html为本地文件 print(doc("title"))
css选择器
html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1">Python</li> <li class="object-2">大法</li> <li class="object-3">好</li> </ul> </body> </html> """
# 先选取id为container的节点,在选取内部class属性为object-1的节点 doc = pq(html) print(doc("#container .object-1")) print(type(doc("#container .object-1"))) # 输出类型还是PyQuery类型 <li class="object-1">Python</li> <class 'pyquery.pyquery.PyQuery'>
查找节点
html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1"> Python <span>你好</span> </li> <li class="object-2">大法</li> <li class="object-3">好</li> </ul> </body> </html> """
子节点
获取所有子孙节点
# 获取所有子孙节点 doc = pq(html) a = doc("#container") lis = a.find("li") # 查询的范围是节点的所有子孙节点 print(lis) <li class="object-1"> Python <span>你好</span> </li> <li class="object-2">大法</li> <li class="object-3">好</li>
获取所有子节点
# 获取所有子节点 doc = pq(html) a = doc("#container") li = a.children() print(li)
通过css选择器选择子节点中的某个节点
# 通过css选择器选择子节点中的某个节点 筛选出子节点中class属性为object-1的节点 doc = pq(html) a = doc("#container") li = a.children(".object-1") print(li) <li class="object-1"> Python <span>你好</span> </li>
父节点
直接父节点
# 这里的父节点是该节点的直接父节点 doc = pq(html1) a= doc(".object-1") li = a.parent() print(li) <ul id="container"> <li class="object-1"> Python <span>你好</span> </li> <li class="object-2">大法</li> <li class="object-3">好</li> </ul>
祖先节点
# 获取所有父节点,即祖先节点 doc = pq(html1) a = doc(".object-1") li = a.parents() print(li)
# 结果会有两个,一个是父级节点一个是祖先节点
通过css选择器选择父节点中的某个节点
doc = pq(html1) a = doc(".object-1") li = a.parents("#container") print(li) <ul id="container"> <li class="object-1"> Python <span>你好</span> </li> <li class="object-2">大法</li> <li class="object-3">好</li> </ul>
兄弟节点
获取所有兄弟节点
# 获取所有兄弟节点 doc = pq(html) a = doc(".object-1") li = a.siblings() print(li) <li class="object-2">大法</li> <li class="object-3">好</li>
通过css选择器选择兄弟节点中的某个节点
# 通过css选择器选择兄弟节点中的某个节点 doc = pq(html) a = doc(".object-1") li = a.siblings(".object-3") print(li) <li class="object-3">好</li>
遍历
- 上面选择节点的结果可能是多个节点,也可能是单个节点类型都是pyquery类型
单个节点可以直接用str转换成字符串直接打印
doc = pq(html) a = doc(".object-1") li = a.siblings(".object-3") print(str(li)) print(type(str(li))) <li class="object-3">好</li> <class 'str'>
查询结果为多个节点需要遍历来获取
# 查询结果为多个节点需要遍历来获取 # 多个节点需要调用items方法 doc = pq(html) a = doc("li").items() # 调用items会得到一个生成器 print(a) for i in a: # 循环生成器取出每个节点,类型也是pyquery print(i) <generator object PyQuery.items at 0x00000254B449CCA8> <li class="object-1"> Python <span>你好</span> </li> <li class="object-2">大法</li> <li class="object-3">好</li>
获取信息
html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1"> Python <a href="www.taobao.com">world</a> <a href="www.baidu.com">hello</a> </li> <li class="object-2"> 大法 <a href="www.taobao.com">world</a> </li> <li class="object-3">好</li> </ul> </body> </html> """
获取属性
# 找到某个节点后,就可以调用attr()方法来获取属性 a = doc(".object-1") # print(a.find("a").attr("href")) # 当返回结果包含多个节点时,调用attr()方法只会得到第一个节点的属性 # 如果想要获取所有a节点的属性,需要使用遍历 for i in a.find("a").items(): print(i.attr("href")) www.taobao.com www.baidu.com
获取文本
- 调用text()方法获取文本 - 当我们得到的结果是多个节点时 - text() 可以获取到匹配标签内的所有文本,返回的是所有文本内容组成的字符串 - html() 返回的是匹配到的所有节点中的第一个节点内的html文本,如果想要获取所有节点中的html需要遍历
获取纯文本
# 获取纯文本 doc = pq(html) li = doc("li") li = li.text() print(li)
Python world hello 大法 world 好
获取节点内的HTML
# 获取节点内的HTML 带标签 只能获取匹配到的第一个节点内的HTML doc = pq(html) li = doc("li") print(li.html()) Python <a href="www.taobao.com">world</a> <a href="www.baidu.com">hello</a>
获取节点内的所有HTML
# 遍历获取所有节点中的html doc = pq(html) li = doc("li") for i in li.items(): print(i.html()) Python <a href="www.taobao.com">world</a> <a href="www.baidu.com">hello</a> 大法 <a href="www.taobao.com">world</a> 好
节点操作
html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1"> Python <a href="www.taobao.com">world</a> <a href="www.baidu.com">hello</a> </li> <li class="object-2"> 大法 <a href="www.taobao.com">world</a> </li> <li class="object-3">好</li> </ul> </body> </html> """
删除属性
doc = pq(html) a = doc(".object-2") print(a) a.removeClass("object-2") # 删除object-2这个class属性 print(a) <li class="object-2"> 大法 <a href="www.taobao.com">world</a> </li> <li class=""> 大法 <a href="www.taobao.com">world</a> </li>
添加属性
doc = pq(html) a = doc(".object-2") print(a) a.removeClass("object-2") # 删除object-2这个class属性 print(a) a.addClass("item") # 给该标签添加一个item的class属性 print(a) <li class="object-2"> 大法 <a href="www.taobao.com">world</a> </li> <li class=""> 大法 <a href="www.taobao.com">world</a> </li> <li class="item"> 大法 <a href="www.taobao.com">world</a> </li>
attr
# 属性操作 【一个参数是查找 两个参数是设置属性】 # 修改属性 doc = pq(html) a = doc(".object-1") a.attr("name","henry") # 给li标签添加一个name属性,值为henry print(a) <li class="object-1" name="henry"> Python <a href="www.taobao.com">world</a> <a href="www.baidu.com">hello</a> </li>
text
# 文本操作 【有参数是添加或修改文本内容 没有参数是查找所有文本内容】 # 文本内容操作 doc = pq(html) a = doc(".object-1") a.text("hello world") print(a) <li class="object-1">hello world</li>
html
# 标签操作 【有参数是添加或修改标签 没有参数是查找第一个标签,获取所有需要遍历】 # 标签操作 doc = pq(html) a = doc(".object-1") a.html("<span>span标签</span>") print(a) <li class="object-1"><span>span标签</span></li>
伪类选择器
html = """ <div class="wrap"> <div id="container"> <ul class="list"> <li class="item-0">fist item</li> <li class="item-1"><a href="link1.html">second</a></li> <li class="item-0 active"><a href="link2.html"><span class="bold">third item</span></a></li> <li class="item-1 active"><a href="link3.html">fourth item</a></li> <li class="item-0"><a href="link4.html">fifth item</a></li> </ul> </div> </div> """
选择第一个节点
# 选择第一个节点 doc = pq(html) a = doc("li:first-child") print(a) <li class="item-0">fist item</li>
选择最后一个节点
# 选择最后一个节点 doc = pq(html) a = doc("li:last-child") print(a) <li class="item-0"><a href="link4.html">fifth item</a></li>
选择指定节点
# 选择第2个li节点 doc = pq(html) a = doc("li:nth-child(2)") print(a) <li class="item-1"><a href="link1.html">second</a></li>
选择指定节点之后的节点
# 选择第2个节点之后的所有节点 doc = pq(html) a = doc("li:gt(2)") print(a) <li class="item-1 active"><a href="link3.html">fourth item</a></li> <li class="item-0"><a href="link4.html">fifth item</a></li>
选择偶数节点
# 选择偶数位值节点 doc = pq(html) a = doc("li:nth-child(2n)") print(a) <li class="item-1"><a href="link1.html">second</a></li> <li class="item-1 active"><a href="link3.html">fourth item</a></li>
包含哪些文本的节点
# 包含second文本的节点 doc = pq(html) a = doc("li:contains(second)") print(a) <li class="item-1"><a href="link1.html">second</a></li>