爬虫之解析库pyquery

初始化

安装: pip install pyquery

字符串的形式初始化

html = """
<html lang="en">
    <head>
        简单好用的
        <title>PyQuery</title>
    </head>
    <body>
        <ul id="container">
            <li class="object-1">Python</li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        </ul>
    </body>
</html>
"""
doc = pq(html)
print(doc("title"))

<title>PyQuery</title>

URL初始化

# PyQuery对象首先会请求这个url,用得到的HTML内容完成初始化
doc = pq(url="https://www.cnblogs.com/songzhixue/")
print(doc("title"))

<title>村里唯一的架构师 - 博客园</title>

doc = pq(requests.get("https://www.cnblogs.com/songzhixue/").text)
print(doc("title"))

<title>村里唯一的架构师 - 博客园</title>

# 两种方法相同

文件初始化

# 读取本地的html文件以字符串的形式传递给PyQuery类来初始 化
doc = pq(filename="demo.html")   # demo.html为本地文件
print(doc("title"))

css选择器

html = """
<html lang="en">
    <head>
        简单好用的
        <title>PyQuery</title>
    </head>
    <body>
        <ul id="container">
            <li class="object-1">Python</li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        </ul>
    </body>
</html>
"""
# 先选取id为container的节点,在选取内部class属性为object-1的节点
doc = pq(html)
print(doc("#container .object-1"))
print(type(doc("#container .object-1"))) # 输出类型还是PyQuery类型

<li class="object-1">Python</li>

<class ‘pyquery.pyquery.PyQuery‘>

查找节点

html = """
<html lang="en">
    <head>
        简单好用的
        <title>PyQuery</title>
    </head>
    <body>
        <ul id="container">
            <li class="object-1">
                Python
                <span>你好</span>
            </li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        </ul>
    </body>
</html>
"""

子节点

获取所有子孙节点

# 获取所有子孙节点
doc = pq(html)
a = doc("#container")
lis = a.find("li")   # 查询的范围是节点的所有子孙节点
print(lis)

<li class="object-1">
                Python
                <span>你好</span>
            </li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        

获取所有子节点

# 获取所有子节点
doc = pq(html)
a = doc("#container")
li = a.children()
print(li)

通过css选择器选择子节点中的某个节点

# 通过css选择器选择子节点中的某个节点  筛选出子节点中class属性为object-1的节点
doc = pq(html)
a = doc("#container")
li = a.children(".object-1")
print(li)

<li class="object-1">
                Python
                <span>你好</span>
            </li>

父节点

直接父节点

# 这里的父节点是该节点的直接父节点
doc = pq(html1)
a= doc(".object-1")
li = a.parent()
print(li)

<ul id="container">
            <li class="object-1">
                Python
                <span>你好</span>
            </li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        </ul>

祖先节点

# 获取所有父节点,即祖先节点
doc = pq(html1)
a = doc(".object-1")
li = a.parents()
print(li)

通过css选择器选择父节点中的某个节点

doc = pq(html1)
a = doc(".object-1")
li = a.parents("#container")
print(li)

<ul id="container">
            <li class="object-1">
                Python
                <span>你好</span>
            </li>
            <li class="object-2">大法</li>
            <li class="object-3">好</li>
        </ul>

兄弟节点

获取所有兄弟节点

# 获取所有兄弟节点
doc = pq(html)
a = doc(".object-1")
li = a.siblings()
print(li)

<li class="object-2">大法</li>
            <li class="object-3">好</li>

通过css选择器选择兄弟节点中的某个节点

# 通过css选择器选择兄弟节点中的某个节点
doc = pq(html)
a = doc(".object-1")
li = a.siblings(".object-3")
print(li)

<li class="object-3">好</li>

遍历

- 上面选择节点的结果可能是多个节点,也可能是单个节点类型都是pyquery类型

单个节点可以直接用str转换成字符串直接打印

doc = pq(html)
a = doc(".object-1")
li = a.siblings(".object-3")
print(str(li))
print(type(str(li)))

<li class="object-3">好</li>

<class ‘str‘>

查询结果为多个节点需要遍历来获取

# 查询结果为多个节点需要遍历来获取
# 多个节点需要调用items方法
doc = pq(html)
a = doc("li").items()    # 调用items会得到一个生成器
print(a)

for i in a:    # 循环生成器取出每个节点,类型也是pyquery
    print(i)

<generator object PyQuery.items at 0x00000254B449CCA8>
<li class="object-1">
                Python
                <span>你好</span>
            </li>

<li class="object-2">大法</li>

<li class="object-3">好</li>

获取信息

html = """
<html lang="en">
    <head>
        简单好用的
        <title>PyQuery</title>
    </head>
    <body>
        <ul id="container">
            <li class="object-1">
                Python
                <a href="www.taobao.com">world</a>
                <a href="www.baidu.com">hello</a>

            </li>
            <li class="object-2">
                大法
                <a href="www.taobao.com">world</a>
            </li>
            <li class="object-3">好</li>
        </ul>
    </body>
</html>
"""

获取属性

# 找到某个节点后,就可以调用attr()方法来获取属性
a = doc(".object-1")
# print(a.find("a").attr("href"))
# 当返回结果包含多个节点时,调用attr()方法只会得到第一个节点的属性

# 如果想要获取所有a节点的属性,需要使用遍历
for i in a.find("a").items():
    print(i.attr("href"))

www.taobao.com
www.baidu.com

获取文本

- 调用text()方法获取文本
- 当我们得到的结果是多个节点时
    - text()  可以获取到匹配标签内的所有文本,返回的是所有文本内容组成的字符串
    - html()  返回的是匹配到的所有节点中的第一个节点内的html文本,如果想要获取所有节点中的html需要遍历

获取纯文本

# 获取纯文本
doc = pq(html)
li = doc("li")
li = li.text()
print(li)
Python world hello 大法 world 好

获取节点内的HTML

# 获取节点内的HTML    带标签 只能获取匹配到的第一个节点内的HTML
doc = pq(html)
li = doc("li")
print(li.html())

Python
<a href="www.taobao.com">world</a>
<a href="www.baidu.com">hello</a>

获取节点内的所有HTML

# 遍历获取所有节点中的html
doc = pq(html)
li = doc("li")
for i in li.items():
    print(i.html())

Python
<a href="www.taobao.com">world</a>
<a href="www.baidu.com">hello</a>
大法
<a href="www.taobao.com">world</a>
好

节点操作

html = """
<html lang="en">
    <head>
        简单好用的
        <title>PyQuery</title>
    </head>
    <body>
        <ul id="container">
            <li class="object-1">
                Python
                <a href="www.taobao.com">world</a>
                <a href="www.baidu.com">hello</a>

            </li>
            <li class="object-2">
                大法
                <a href="www.taobao.com">world</a>
            </li>
            <li class="object-3">好</li>
        </ul>
    </body>
</html>
"""

删除属性

doc = pq(html)
a = doc(".object-2")
print(a)
a.removeClass("object-2")   # 删除object-2这个class属性
print(a)

<li class="object-2">
                大法
                <a href="www.taobao.com">world</a>
            </li>

<li class="">
                大法
                <a href="www.taobao.com">world</a>
            </li>

添加属性

doc = pq(html)
a = doc(".object-2")
print(a)
a.removeClass("object-2")   # 删除object-2这个class属性
print(a)
a.addClass("item")     # 给该标签添加一个item的class属性
print(a)

<li class="object-2">
                大法
                <a href="www.taobao.com">world</a>
            </li>

<li class="">
                大法
                <a href="www.taobao.com">world</a>
            </li>

<li class="item">
                大法
                <a href="www.taobao.com">world</a>
            </li>

attr

# 属性操作  【一个参数是查找 两个参数是设置属性】
# 修改属性
doc = pq(html)
a = doc(".object-1")
a.attr("name","henry")  # 给li标签添加一个name属性,值为henry
print(a)

<li class="object-1" name="henry">
                Python
                <a href="www.taobao.com">world</a>
                <a href="www.baidu.com">hello</a>

            </li>

text

# 文本操作  【有参数是添加或修改文本内容 没有参数是查找所有文本内容】
# 文本内容操作
doc = pq(html)
a = doc(".object-1")
a.text("hello world")
print(a)

<li class="object-1">hello world</li>

html

# 标签操作  【有参数是添加或修改标签 没有参数是查找第一个标签,获取所有需要遍历】
# 标签操作
doc = pq(html)
a = doc(".object-1")
a.html("<span>span标签</span>")
print(a)

<li class="object-1"><span>span标签</span></li>

伪类选择器

html = """
    <div class="wrap">
        <div id="container">
            <ul class="list">
                <li class="item-0">fist item</li>
                <li class="item-1"><a href="link1.html">second</a></li>
                <li class="item-0 active"><a href="link2.html"><span class="bold">third item</span></a></li>
                <li class="item-1 active"><a href="link3.html">fourth item</a></li>
                <li class="item-0"><a href="link4.html">fifth item</a></li>
            </ul>
        </div>
    </div>
"""

选择第一个节点

# 选择第一个节点
doc = pq(html)
a = doc("li:first-child")
print(a)

<li class="item-0">fist item</li>

选择最后一个节点

# 选择最后一个节点
doc = pq(html)
a = doc("li:last-child")
print(a)

<li class="item-0"><a href="link4.html">fifth item</a></li>

选择指定节点

# 选择第2个li节点
doc = pq(html)
a = doc("li:nth-child(2)")
print(a)

<li class="item-1"><a href="link1.html">second</a></li>

选择指定节点之后的节点

# 选择第2个节点之后的所有节点
doc = pq(html)
a = doc("li:gt(2)")
print(a)

<li class="item-1 active"><a href="link3.html">fourth item</a></li>
                <li class="item-0"><a href="link4.html">fifth item</a></li>

选择偶数节点

# 选择偶数位值节点
doc = pq(html)
a = doc("li:nth-child(2n)")
print(a)

<li class="item-1"><a href="link1.html">second</a></li>
                <li class="item-1 active"><a href="link3.html">fourth item</a></li>

包含哪些文本的节点

# 包含second文本的节点
doc = pq(html)
a = doc("li:contains(second)")
print(a)

<li class="item-1"><a href="link1.html">second</a></li>

原文地址:https://www.cnblogs.com/songzhixue/p/11251847.html

时间: 2024-07-29 21:07:11

爬虫之解析库pyquery的相关文章

Python爬虫【解析库之beautifulsoup】

解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulSoup html='''<div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="pan

爬虫智能解析库 Readability 和 Newspaper 的用法

舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点.比如一个新闻页面我们需要爬取其标题.正文.时间.作者等信息,如果用传统的方式来实现,每一个站点都要配置非常多的规则,如果要维护一个几百上千的站点,那人力成本简直太高了. 如果有一种方式可以在保证差不多的准确率的前提下,大幅提高提取效率的话,就需要用到智能文本提取了. 本文首先介绍一下智能文本提取的基本原理,让大家对智能提取有基本的了解.然后介绍几个比较基础的工具包,准确率并不是很高,可以尝试一用.最后再介绍几

python爬虫之解析库Beautiful Soup

Beautiful Soup4操作 为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个标签的形式,来进行查找的,有点像jquery的形式.提升效率,我们在进行爬虫开发的时候,进程会用到正则来进行查找过滤的操作,纯手动会及其浪费时间. Beautiful Soup示例摘自官网 html_doc = """ <html>

python爬虫之解析库正则表达式

上次说到了requests库的获取,然而这只是开始,你获取了网页的源代码,但是这并不是我们的目的,我们的目的是解析链接里面的信息,比如各种属性  @href  @class span  抑或是p节点里面的文本内容,但是我们需要一种工具来帮我们寻找出这些节点,总不能让我们自己一个一个复制粘贴来完成吧,那样的话,还要程序员干嘛>>计算机是为了方便人们才被发明出来的. 这次我们使用一个非常好用的工具>>正则表达式,可能有的大佬已经听说过了,哦,就是那么一个东西,并说,不是用css选择器或

爬虫之解析库Xpath

简介 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言. XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初XPath的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是XPath很快的被开发者采用来当作小型查询语言. 语法 选取节点 XPath 使用路径表达式在 XML 文档中选取节点.节点是通过沿着路径或者 step 来选取的. [1] 下面列出了最有用的路径表达式: 表达式 描述

解析库pyquery使用

初始化 安装: pip install pyquery 字符串的形式初始化 html = """ <html lang="en"> <head> 简单好用的 <title>PyQuery</title> </head> <body> <ul id="container"> <li class="object-1">Pyth

【BOOK】解析库--pyquery

CSS选择器 1.初始化 html=''' <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 active"><a

Python3 BeautifulSoup和Pyquery解析库随笔

BeautifuSoup和Pyquery解析库方法比较 1.对象初始化: BeautifySoup库: 1 from bs4 import BeautifulSoup 2 3 html = 'html string......' 4 soup = BeautifulSoup(html, 'lxml') Pyquery库: 1 from pyquery import PyQuery as pq 2 3 # 以字符串初始化 4 html = 'html string...' 5 doc = pq(h

(最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括

一.Xpath 解析 ? xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则:   nodename :选取此节点的所有子节点   // :从当前节点选取子孙节点   / :从当前节点选取子节点   . : 选取当前节点   .. : 选取当前节点父节点  @ : 选取属性 1.初始化html etree.parse()是初始化html构造一个XPath解析对象: etree.tostring()是修复html文件中代码,把缺的