一文带你了解PyQuery解析器

liftword10小时前技术文章1

从本质上看, 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中的DSL领域特定语言?

    在Python中,DSL是指专门针对特定领域或者是解决某个特定领域问题所设计的语言,这个操作通常用于解决某个特定领域的问题,而不是通用的编程操作,DSL可以通过Python的语法以及其语言特性来实现,...

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

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

    使用 Python 开发一个 Python 解释器

    原文地址:https://python.plainenglish.io/introduction-to-creating-interpreter-using-python-c2a9a6820aa0原文...

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

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

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

    Pypy 简介#python##python自学#PyPy是一个高性能的Python解释器,它使用JIT(即时编译)技术来加速Python代码的执行速度。PyPy支持所有的标准Python库,并且...