当前位置: 首页 > 科技观察

Python爬虫神器PyQuery的使用方法

时间:2023-03-12 11:18:17 科技观察

前言是不是觉得XPath的用法有些晦涩难记?是不是觉得BeautifulSoup的语法有点小气难懂?您是否正在努力学习正则表达式,因为您是否为遗漏一点而疯狂?您是否已经具备一些了解选择器的前端基础知识,但对其他奇怪的选择器语法感到困惑?那么,前端大佬的福音来了,PyQuery来了,听到这个名字你一定会想到jQuery。如果你熟悉jQuery,那么PyQuery是解析文档的最佳选择!包括我!PyQuery是严格按照jQuery为模型的Python实现。语法几乎与jQuery相同,因此无需费心去记住奇怪的方法。世上有这种好事?我等不及了!安装这样的神器,赶紧安装吧!来!pipinstallpyquery参考源本文参考官方文档。更多内容可以去官方文档学习,毕竟有最正宗的。当前版本1.2.4(2016/3/24)官方文档(https://pythonhosted.org/pyquery/)介绍pyquery允许对xml文档进行jquery查询。API尽可能类似于jquery.pyquery使用lxml进行fastxml和html操作。这不是(或者至少现在还不是)生成javascript代码或与之交互的库。我只是喜欢jqueryAPI而我在python中错过了它,所以我告诉自己“嘿,让我们在python中制作jquery”。这是结果。它可以用于多种用途,我将来可能会尝试的一个想法是使用它来使用您使用pyquery修改的纯http模板进行模板化。I还可以用于网络抓取或用于Deliverance的主题应用程序。pyquery允许您使用jQuery语法来操作xml。这与jQuery非常相似。如果利用lxml,pyquery对xml和html的处理会更快。这个库不是(至少现在不是)可以与JavaScript交互的代码库,它只是非常类似于jQueryAPI。初始化这里介绍四种初始化方法。(1)直接stringfrompyqueryimportPyQueryaspqdoc=pq("")pq参数可以直接传入HTML代码,doc现在相当于jQuery中的$符号。(2)lxml.etreefromxmlxmlimportetreedoc=pq(etree.fromstring(""))可以先用lxml的etree对代码进行处理,这样如果你的HTML代码有不完整或者遗漏的地方,自动转换HTML代码以获得完整和清晰的结构。(3)直接通过urlfrompyqueryimportPyQueryaspqdoc=pq('http://www.baidu.com')这里就像是直接请求一个网页,类似于使用urllib2直接请求链接,得到html代码。(4)文件传输frompyqueryimportPyQueryaspqdoc=pq(filename='hello.html')可以直接传输某个路径的文件名。快速体验下面我们以本地文件为例,传入一个名为hello.html的文件,文件内容为

    firstitemseconditem第三项第四项ahref="link5.html">fifthitem
从pyqueryimportPyQueryaspqdoc=pq(filename='hello.html')printdoc.html()printtype(doc)编写如下程序li=doc('li')printtype(li)printli.text()运行结果
    firstitemseconditemthirditemfourthitemfifthitem
firstitemseconditemthirditemfourthitemfifthitem看,回想一下jQuery的语法,运行结果是不是一样?这里我们注意到PyQuery初始化后,返回类型是PyQuery,使用选择器过滤一次后,返回结果的类型还是PyQuery,和jQuery一模一样,再好不过了!但是想想BeautifulSoup和XPath返回的是什么?一个列表!一个不能再被过滤的对象(这里指的还是使用BeautifulSoup或者XPath语法)!不过比比PyQuery,哦,我太喜欢了!你完全可以按照jQuery的语法来操作PyQueryfrompyqueryimportPyQueryaspqp=pq('

')('p')printp.attr("id")printp.attr("id","plop")printp.attr("id","hello")运行结果hello从pyqueryimportPyQueryaspqp=pq('

')('p')printp.addClass('beauty')printp.removeClass('hello')printp.css('font-size','16px')printp.css({'background-color':'yellow'})运行结果还是那么优雅自信!这里我们发现这是一系列的操作,p一直在原来的结果上变化。所以在执行了上面的操作之后,p本身也发生了变化。来自pyqueryimportPyQueryaspqp=pq('

')('p')printp.append('checkoutreddit')printp.prepend('Ohyes!')d=pq('Germy
')p.prependTo(d('#test'))printpprintdd.empty()printd运行结果checkoutreddit

哦耶!checkoutreddit

哦耶!签出reddit

哦耶!checkoutreddit

Germy
这个不用多解释了。DOM操作与jQuery完全相同。Traversal遍历使用items方法返回一个对象列表,或者lambdafrompyqueryimportPyQueryaspqdoc=pq(filename='hello.html')lis=doc('li')forliinlis.items():printli.html()printlis.each(lambdae:e)运行结果firstitemseconditemthirditem第四项第五项第一项seconditemthirditem第四项第五项但大多数时候items方法仍然用于请求网页。PyQuery本身具有网页请求的功能,它会将请求的网页代码转换为PyQuery对象。frompyqueryimportPyQueryaspqprintpq('http://cuiqingcai.com/',headers={'user-agent':'pyquery'})printpq('http://httpbin.org/post',{'foo':'bar'},method='post',verify=True)感受一下,GET,POST,应有尽有。AjaxPyQuery也支持Ajax操作,有get和post方法,但不常用。一般我们不会用PyQuery来进行网络请求,只是为了解析。PyQueryAjaxAPI绝对少不了,放出API。API(https://pythonhosted.org/pyquery/api.html)最原始最全的API都在里面!如果您不熟悉jQuery语法,强烈建议先学习jQuery,然后再回到PyQuery。会觉得无比甜蜜!结语是用PyQuery完成的,我已经爱上了他!你呢?