一起学爬虫——PyQuery常用用法总结

什么是PyQuery PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像。和XPATH,Beautiful Soup比起来,PyQuery更加灵活,提供增加节点的class信息,移除某个节点,提取文本信息等功能。 初始化PyQuery对象 html文档的所有操作都需要PyQuery对象来完成,初始化PyQuery对象主要有三种方式,分别是通过网址、字符串和文件名创建。 方式一:通过网址初始化PyQyery对象 先看一段代码: from pyquery import PyQuery as pq s = 'PyQuery用法总结<title></html>' doc = pq(s) print(doc('title')) 运行结果: <title>PyQuery用法总结 首先要import PyQuery类,然后将字符串传递给PyQuery类,这样就生成了一个PyQuery对象,通过该对象就可以访问字符串中的title节点。 PyQuery还会将残缺的html文档补全。看下面的代码: from pyquery import PyQuery as pq s = 'PyQuery用法总结' doc = pq(s) print(doc('html')) 运行的结果: PyQuery用法总结 可以我们的字符串的html节点是没有闭合的,并且缺少head节点。初始化PyQuery对象之后,会把html文档补全,并且自动加上head节点。 方式二:URL网址初始化PyQyery对象 将要解析的URL网址当做参数传递给PyQuery类: from pyquery import PyQuery as pq url = 'http://www.bigdata17.com' doc = pq(url=url,encoding='utf-8') print(doc('title')) 运行结果: Home - Summer哥的自留地 方式三:通过文件初始化PyQyery对象 这个方式也比较常用,很多时候我们会将网站爬取下来然后保存在本地磁盘: from pyquery import PyQuery as pq doc = pq(filename='test_pyquery.html',encoding='utf-8') print(doc('title')) 访问节点属性: 使用attr()方法访问节点的属性: from pyquery import PyQuery as pq li = pq('
  • ')('li') print(li.attr("id")) 运行结果: test1 上面的代码中有两个id不同的li节点,但是attr()方法只取第一个li节点的id属性值,而不取第二个,我们把上面的代码修改下,把第一个li节点的id属性去掉,attr方法是否只取第一个复合条件节点的属性值: from pyquery import PyQuery as pq li = pq('
  • ')('li') print(li.attr("id")) 运行结果: None 第一个li节点没有id属性,因此返回结果为None,所以可见,attr()方法返回的是第一个节点的属性值。 那要取多个li节点的属性值,要怎么做呢?这就要结合items()方法来实现。items()方法是返回的节点的生成器generator object PyQuery.items: from pyquery import PyQuery as pq li = pq('
  • ')('li') print(li.items()) for item in li.items(): print(item.attr("id")) 运行结果: test1 test2 动态添加节点属性 PyQuery有很多方法动态添加节点的属性,我们挑选几个比较常用的方法介绍个大伙。 addClass(),动态添加节点class属性: from pyquery import PyQuery as pq html = '
  • ' li = pq(html)('li') li.addClass("addClass") print(li) 运行结果:
  • 可见li节点的calss属性值有test1变为test1 addclass。 addClass()方法只能动态添加节点class属性的值,能不能动态添加其他属性呢?答案是当然可以,attr()方法就可以实现: from pyquery import PyQuery as pq html = '
  • ' li = pq(html)('li') li.attr("name","li name") print(li) li.attr("type","li") print(li) print(li.attr("type")) 运行结果:
  • li 上面的代码一共执行了3次attr()方法,执行第一次attr()方法时,有两个参数,分别是name和li name。这是给li节点添加name属性及属性值。执行第二次attr()方法也有两个参数,分别是type和li,这是给li几点添加type属性及type属性值。执行第三次方法attr()方法只有一个type参数,根据前面介绍的attr()方法的用法可知,是获取li节点type属性的值。 小结: attr()方法只有一个参数时,是获取节点的属性值,有两个参数时,是给节点添加属性及属性值,第一个参数时属性,第二个参数时属性值。 removeClass(),动态移除节点的class属性: from pyquery import PyQuery as pq html = '
  • ' li = pq(html)('li') li.removeClass("test1") print(li) 运行结果:
  • 将class节点的属性值有test1变为“”。 动态添加/修改文本值 PyQuery支持动态给节点添加文本值: from pyquery import PyQuery as pq html = '
  • ' li = pq(html)('li') li.html("use html() dynamic add text") print(li) li.text("use text() dynamic add text") print(li) 运行结果:
  • use html() dynamic add text
  • use text() dynamic add text
  • 可见使用html()和text()方法都可以动态的给节点添加或修改节点的文本值。 获取节点文本值 PyQuery提供text()和html()方法获取节点的文本属性值: from pyquery import PyQuery as pq html = '
  • li text value
  • ' li = pq(html)('li') print(li.text()) print(li.html()) 运行结果: li text value li text value 小结: html()和text()如果没参数,则是获取属性的文本值,如果有参数,则是改变或者添加节点的属性值。 移除节点: remove()方法可以动态移除节点: from pyquery import PyQuery as pq html = '''
      hello I am ul tag
    • hello I am li tag
    ''' ul = pq(html)('ul') print(ul.text()) print('执行remove()移除节点') ul.find('li').remove() print(ul.text()) 运行结果: hello I am ul tag hello I am li tag 执行remove()移除节点 hello I am ul tag 上述代码的ul节点中有个li节点,执行ul.text()方法会返回包括li节点的文本信息,如果我们不想返回li节点的文本信息,仅仅只需要ul节点的文本信息“hell I am ul tag”,要怎么做呢?这时候remove()方法就派上用场了,它删除掉ul节点内的li节点。 查找节点 PyQuery支持使用css的.和#来查找节点: from pyquery import PyQuery as pq html = '''
      hello I am ul tag
    • hello I am li tag
    • hello I am li tag too
    ''' doc = pq(html) print(doc('.div_tag #ul_tag li')) 运行结果:
  • hello I am li tag
  • hello I am li tag too
  • 上述代码是通过.div_tag获取class为div_tag的节点,然后通过#ul_tag获取id为ul_tag的节点,最后返回所有的li节点。 find()方法查找节点: html = '''
    ''' doc = pq(html) print(doc('.div_tag #ul_tag').find("li")) 运行结果:
  • hello I am li tagwww.bigdata17.com
  • hello I am li tag too
  • 可见find("li")是把所有li节点及子节点都查找出来。 还有一个children()方法,是获取当前节点的所有子节点。该方法可以传入css选择器:children('.ul_tag')。 html = '''
    ''' doc = pq(html) print(doc('.div_tag #ul_tag').find("li")) 运行结果:
  • hello I am li tagwww.bigdata17.com
  • hello I am li tag too
  • 使用parent()方法获取当前节点的父亲节点: html = '''
    ''' doc = pq(html) print(doc('.div_tag #ul_tag li').parent()) 运行结果: 上述代码通过.div_tag #ul_tag li css选择器定位到li节点,然后调用parent()方法获取li节点的父节点ul。 parents()返回当前节点的所有祖宗节点: html = '''
    ''' doc = pq(html) print(doc('.div_tag #ul_tag li').parents()) 运行结果:
    上面代码返回li节点的所有祖宗节点:html,body,div,ul。 siblings()方法返回当前节点的兄弟节点: html = ''' ''' doc = pq(html) print(doc('.div_tag #ul_tag .li_class1').siblings()) 运行结果:
  • hello I am li tag too
  • hello I am the third li tag
  • 使用.div_tag #ul_tag .li_class1 CSS节点选择器获取到class为liclassq1的li节点,就是第一个li节点,然后调用siblings()方法获取到子节点,分别是 第二和第三个li节点。 sibligs()还支持传入css选择器筛选符合条件的li节点: print(doc('.div_tag #ul_tag .li_class1').siblings('.li_class3')) 运行结果:
  • hello I am the third li tag
  • 总结:本文讲述了如何使用PyQuery获取网页节点,节点的文本信息,改变节点属性,删除节点属性,增加节点属性等知识点。 用心写好每篇技术文章 作者:Summer哥 出处:www.bigdata17.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 关注本人的公众号获取更多关于大数据和机器学习方面的知识 标签: 爬虫 好文要顶 关注我 收藏该文 summer哥 关注 - 0 粉丝 - 27 +加关注 1 0 « 上一篇:机器学习该怎么入门? posted @ 2018-12-03 06:00 summer哥 阅读(226) 评论(0) 编辑 收藏 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。 【推荐】超50万VC++源码: 大型组态工控、电力仿真CAD与GIS源码库! 【福利】华为云4核8G云主机免费试用 【活动】申请成为华为云云享专家 尊享9大权益 【活动】腾讯云+社区开发者大会12月15日首都北京盛大起航! 腾讯云1129 相关博文: · 一起学爬虫——urllib库常用方法用法总结 · 一起学makefile · python3解析库pyquery · 一起学Maven · Python中PyQuery库的使用总结 最新新闻: · 王峰宣布将组建蓝火工作室 专门开发发行区块链游戏 · 蜻蜓FM将投1.5亿在儿童音频 推智能硬件内容服务方案 · 这个世界最终属于软件,微软重回市值第一 · 肿瘤内90%以上杀伤性T细胞根本就不能识别癌细胞 · 原借贷宝高管任火币全球站CEO 火币网交易可高息借贷 » 更多新闻... 公告 https://www.cnblogs.com/airnew/p/10056551.html
    50000+
    5万行代码练就真实本领
    17年
    创办于2008年老牌培训机构
    1000+
    合作企业
    98%
    就业率

    联系我们

    电话咨询

    0532-85025005

    扫码添加微信