解析庫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>&#13;


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

<title>村裏惟一的架構師 - 博客園</title>&#13;

# 兩種方法相同
複製代碼

文件初始化

# 讀取本地的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
複製代碼

獲取文本

1
2
3
4
-  調用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>
相關文章
相關標籤/搜索