一文带你了解PyQuery解析器

liftword4个月前 (03-12)技术文章27

从本质上看, PyQuery 与知名的Beautiful Soup同样具备解析HTML文档的卓越能力。值得关注的是,鉴于 PyQuery是基于业界领先的lxml库构建而成,其在实际应用环境下的表现速度要高于Beautiful Soup。值得重点关注的,PyQuery仅支持CSS这一种样式选择器,基于这种精益求精的设计理念,使得其在功能方面相较于Beautiful Soup展现出了明显优势,使得诸如基础内容抓取等操作过程更加简便实用。如果您对CSS选择器有着深刻理解或者对于该技术有着特别的偏好,那么无疑,PyQuery将会成为您最佳的选择。

pyquery: a jquery-like library for python, 官网对 PyQuery 的介绍,像JQuery一样的Python库。

PyQuery

开始使用

PyQuery 是第三方库,因此在使用之前需要安装该库。

pip install pyquery

安装好后,就可以使用了,以下为获取百度标题的示例:

from pyquery import PyQuery as pq
doc = pq(url="http://www.baidu.com")
print(doc('title').text())

# 	百度一下,你就知道

在上边的代码中,直接将网址作为参数传递给 PyQuery 对象,接着从获取到的对象中,获取 title 标签,并调用 text 方法获取其文本值。

上边的案例中,我们使用了 URL 参数初始化 PyQuery,其构造方法还提供了使用字符串文件初始化的功能,可以根据实际情况选择使用。

from pyquery import PyQuery as pq

#----字符串初始化-----
html = """第一个标签"""
doc = pq(html)
print(doc('span').text())

#----文件初始化-----
doc = pq(filename='./test.html')
print(doc('span').text())

获取文本和 HTML

在 PyQuery 中,使用 text()方法检索元素文本,并可以使用 html()方法获取元素的 HTML 数据。



  
    Header
                       
  

  
    

Operating systems

  • Solaris
  • FreeBSD
  • Debian
  • NetBSD
  • Windows
# 获取文本
text = doc("ul").text()
print("\n".join(text.split()))
# Solaris
# FreeBSD
# Debian
# NetBSD
# Windows

# 获取html元素
text = doc("ul").html()
print("\n".join(text.split())) 
# 
  • Solaris
  • #
  • FreeBSD
  • #
  • Debian
  • #
  • NetBSD
  • #
  • Windows
  • 获取属性

    通过使用 attr()方法获取属性值内容

    # 现获取元素对象
    tag = doc("ul")
    
    # 再获取元素属性
    print(tag.attr("id"))
    print(tag.attr("style")) 
    
    # mylist
    # width:150px

    标签选择

    使用选择器可以方便的从 html 文档中选择需要的标签,可以是标签的名字,也可以是 clss,id 或其他属性。熟悉前端框架 jQuery 或者 css 的就会非常容易上手。

    def print_item(self, item):
        print("Tag: {0}, Text: {1}".format(item.tag, item.text))
    
    # 选择li的第一个元素
    first_li = doc("li:first")
    # 选择li的最后一个元素
    last_li = doc("li:last")
    # 获取技术li
    odd_lis = doc("li:odd")  
    # 借助each方法遍历所有元素
    odd_lis.each(print_item)
    
    # Solaris
    # Windows
    # Tag: li, Text: FreeBSD
    # Tag: li, Text: NetBSD

    更多的方法

    items()方法,通过此方法获取可迭代元素集合。

    # 将li元素内容放到list中 
    items = [item.text() for item in doc.items('li')]

    filter()方法,通过此方法可以过滤元素,方法接受一个函数,用于判断过滤条件。

    # 获取li标签中以F,D,N开头的元素内容
    doc('li').filter(lambda i: pq(this).text().startswith(('F', 'D', 'N')))

    PyQuery 还提供了对 html 文档编辑的功能,我们在爬虫的时候很少会主动去删除或添加节点,这里就不做过多的说明,以下是一些简单的案例:

    # 删除li最后一个元素
    doc('li:last').remove()
    
    # 获取clss为mylist的节点
    mylist = doc("#mylist")
    # 在节点前添加一个节点
    mylist.prepend("
  • DragonFly
  • ") # 在节点后添加一个节点元素 mylist.append("
  • OpenBSD
  • ") # 给节点添加class mylist.addClass("test") # 删除节点class mylist.removeClass("test")

    相关文章

    深入了解Python 解析器 - CPython

    前言Python 是一门广泛使用的编程语言,而 CPython 则是它最常用的解析器之一。作为 Python 的官方参考实现,CPython 在解释和执行 Python 代码方面扮演着重要的角色。本文...

    详细介绍一下Python中的BeautifulSoup库的使用?

    BeautifulSoup是一个流行的Python爬虫库,主要的作用是用于从HTML和XML文档中提取数据。以其简单易用的API和强大的功能受到广泛的使用,特别是在Web爬虫和数据解析的场景中。下面我...

    python散装笔记——106: 使用 exec 和 eval 动态执行代码

    ArgumentDetailsexpression表达式代码字符串或 code 对象object语句代码字符串或 code 对象globals用于全局变量的 dictionary。如果未指定 loca...

    【Python】性能加速之解析器加速Stackless Python 库使用说明

    Stackless Python 简介#python##python自学#Stackless Python 是一种 Python 编程语言的实现,它的主要特点是不依赖于系统的线程模型,而是使用协程...

    Python神器parse库:从入门到精通,轻松玩转字符串解析!

    喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。引言:为什么parse库是你的下一个必备工具?在Python的世界里,字符串处理是每个开发者都无法回避的任务。无论是从网页抓取数据...

    【Python】性能加速之解析器加速Brython 库使用说明

    Brython 简介#python##python自学#Brython 是一个使用 Python 语言编写的浏览器端 Python 解释器,它可以在浏览器中执行 Python 代码,在 web 开...