pyquery 的使用
跟XPath 和 BeautifulSoup类似的,pyquery也是一个解析库。像Beautiful Soup 一样,初始化pyquery的时候,也需要传入HTML文本来初始化一个pyquery对象。除此以外,还可以直接传入URL,传入文件名等。下面来详细介绍:
from pyquery import PyQuery as pq html = ‘‘‘ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <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"><a href="link3.html"><span class="bold">third item</span></a></li> <li class="item-1"><a href="link4.html">fifth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> </body> </html> ‘‘‘ doc = pq(html) print(doc(‘li‘))
这里首先引入了PyQuery这个对象,取别名为pq,然后声明了一个HTML字符串,并将其当作参数传递给PyQuery对象,这样就完成了初始化了。接下来,将初始化的对象传入CSS选择器,就可以获取到相应的节点。除此以外,还可以传一个URL参数:
from pyquery import PyQuery as pq doc = pq(url=‘https://www.cnblogs.com/jonas-von‘) print(doc(‘title‘))
结果打印输出我的博客的title内容。还可以通过文件的形式初始化:
from pyquery import PyQuery as pq doc = pq(filename=‘test.html‘) print(doc(‘li‘))
当然,在本地需要有test.html这个文件。
1. 基本选择器
其实在上面的实例中也用到了CSS选择器,PyQuery实例对象的参数就是CSS选择器,这在里就不过多阐述了。
2. 查找节点
查找子节点,需要用到find()方法,此时传入的参数就是CSS选择器:
from pyquery import PyQuery as pq doc = pq(filename=‘test.html‘) lis = doc(‘li‘) print(lis.find(‘.bold‘))
首先通过通过元素选择器选择了所有的li,然后调用find()方法,传入类选择器找到了class属性为bold的元素。从这里也可以看出,find()方法查找的范围是所有子孙节点,如果我们只想找子节点,可以用children()方法。
查找父节点,可以使用parent()方法,如果需要查找祖先节点,可以使用parents()方法。
查找兄弟节点,可以使用siblings()方法。
3. 遍历
从上面的实例可以得出结论:pyquery的选择结果可能是多个节点,也可以是一个节点,但无论是一个结果还是多个结果,类型都是PyQuery类型,并不像BeautifulSoup(一个结果直接返回,多个结果使用列表储存再返回)。对于单个节点,可以直接打印输出,也可以直接使用str()方法转化为字符串,但是对于多个节点,我们就需要遍历来获取了。
from pyquery import PyQuery as pq doc = pq(filename=‘test.html‘) lis = doc(‘li‘).items() for li in lis: print(li,type(li))
调用items()方法后,会得到一个生成器,遍历即可得到每个li对象了,这里的类型也是PyQuery对象。
4. 获取信息
提取到某个PyQuery对象后,可以通过attr()方法来获取属性:
from pyquery import PyQuery as pq doc = pq(filename=‘test.html‘) print(doc(‘li span‘).attr(‘class‘))
需要注意的是,attr()方法返回的结果只有一个,无论选择器匹配的结果有多少个。所以,如果存在多个结果时,需要遍历来实现。
调用text()方法来获取标签文本:
from pyquery import PyQuery as pq doc = pq(filename=‘test.html‘) print(doc(‘li span‘).text())
该方法会忽略HTMl标签,只返回纯文字文本,但如果需要获取html文本,可以使用html()方法,此时返回的是标签体!!但是需要注意一个问题,text()可以返回多个结果,而html()只返回第一个匹配的标签体文本,如果需要获取多个,则同样需要遍历。
5. 节点操作
pyquery提供了一系列方法来对节点进行动态修改(类似于jQuery),比如添加或移除一个class等操作:
addClass 和 removeClass
前者用于添加class属性,后者用于删除class属性
attr、text 和 html
除了class 以外,可以通过attr()方法对属性进行操作,还可以使用text()和html()方法来改变标签内容。
remove
移除某个节点
原文地址:https://www.cnblogs.com/jonas-von/p/9186837.html