pyquery:輕鬆、靈活的處理html

介紹

pyquery是一個專門用來解析html的庫,從名字很容易想到jQuery,沒錯,這徹底是仿照jQuery的語法實現的。若是用過jQuery,俺麼pyquery很容易實現

初始化html

pyquery能夠接收一個網址,自動下載內容,也能夠接收已經下載好的字符串格式的html,固然也能夠傳入一個本地html文件。可是咱們通常都會使用requests下載html頁面,而後再將html頁面以字符串的格式傳進去css

from pyquery import PyQuery


html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>古明地覺</title>
</head>
<body>
    <p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <div>
        <p class="s1">古明地戀</p>
    </div>
    <table >
        <tbody>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr class="tr">
                <td>密碼:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
    <a href="http://www.baidu.com" target="_blank">百度</a>
    <a href="http://www.yahoo.com">雅虎</a>
</body>
</html>   
'''

p = PyQuery(html)  # 此時獲得的是一個pyquery對象
print(type(p))  # <class 'pyquery.pyquery.PyQuery'>

# 若是打印p的話,會直接將咱們傳入的html打印出來,只不過p的類型是PyQuery

使用選擇器

from pyquery import PyQuery


html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>古明地覺</title>
</head>
<body>
    <p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <div>
        <p class="s1">古明地戀</p>
    </div>
    <table >
        <tbody>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr class="tr">
                <td>密碼:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
    <a href="http://www.baidu.com" target="_blank">百度</a>
    <a href="http://www.yahoo.com">雅虎</a>
</body>
</html>   
'''

p = PyQuery(html)
# 標籤選擇器
# 打印出標籤爲head的內容
print(p("head"))
"""
<head>
    <meta charset="UTF-8"/>
    <title>古明地覺</title>
</head>
"""
# 可是須要注意的是,這個打印出來的依舊是一個PyQuery類型
# 意味着咱們能夠進一步過濾,可是若是我想要字符串的話呢?直接調用str方法便可
print(str(p("head")))
"""
<head>
    <meta charset="UTF-8"/>
    <title>古明地覺</title>
</head>
"""
# 或者調用html方法,可是此時獲取到的不包括相應的標籤名
# head標籤自己沒了,只保留裏面的內容,此時也是一個字符串的類型
print(p("head").html())
"""

    <meta charset="UTF-8"/>
    <title>古明地覺</title>

"""
# 但若是有不少標籤,好比p標籤,在調用html方法的時候,只會打印第一個p標籤裏面的內容
print(p("p"))
"""
<p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <p class="s1">古明地戀</p>
"""
print(p("p").html())
"""
<a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a>
"""

# 獲取文本
print(p("head").text())
"""
古明地覺
"""
# 能夠看到只獲取了純文本,由於只能title標籤裏面有文本,而title在head裏面

# css選擇器
# 獲取id=bili的標籤
print(p("#bili"))
"""
<p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>

"""

# 獲取class=s1的標籤
print(p(".s1"))
"""
<p class="s1">my name is satori</p>
    <p class="s1">古明地戀</p>
"""

# 獲取tbody下的class=tr的標籤下的全部td標籤
print(p("tbody .tr td"))
"""
<td>密碼:</td>
                <td><input type="password" name="password"/></td>
            
"""
# 能夠看到這和jQuery的語法基本上是一致的
# 若是我只想獲取第一個的話,索引要是越界的話,也不會報錯,會打印空行
print(p("tbody .tr td").eq(0))
"""
<td>密碼:</td>
"""

# 經常使用方法:
'''
p(".color"):獲取class=color的標籤
p("#color"):獲取id=color的標籤
p("*"):獲取全部的標籤
p("p"):獲取全部的p標籤
p("div,p"):獲取全部的div標籤和p標籤
p("div p"):獲取全部div標籤內部的p標籤
p("[target]"):選擇帶有target屬性的全部元素
p("[target=_blank]"):選擇帶有target=_blank的全部元素
'''

filter和find

from pyquery import PyQuery


html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>古明地覺</title>
</head>
<body>
    <p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <div>
        <p class="s1">古明地戀</p>
    </div>
    <table >
        <tbody>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr class="tr">
                <td>密碼:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
    <a href="http://www.baidu.com" target="_blank">百度</a>
    <a href="http://www.yahoo.com">雅虎</a>
</body>
</html>   
'''

p = PyQuery(html)

print(p("p"))  # 這是全部的p標籤
"""
<p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <p class="s1">古明地戀</p>
    
"""

# 我只要class=s1的p標籤,可使用filter過濾
print(p("p").filter(".s1"))  # 表示在找到的p標籤中,過濾出class=s1的p標籤
"""
<p class="s1">my name is satori</p>
    <p class="s1">古明地戀</p>
    
"""

# 若是要按照文本過濾呢?好比我想找出文本內容等於'古明地戀'的p標籤
print(p("p").filter(lambda _, this: PyQuery(this).text() == '古明地戀'))
"""
<p class="s1">古明地戀</p>
    
"""

# find
# 首先filter是過濾獲得符合條件的標籤
# 而find是在符合條件的標籤裏面找
# 舉個例子
"""
p("p").filter(".fuck")表示的是有不少的p標籤,我在選出的這麼多p標籤中,找到class=fuck的p標籤
p("p").find(".fuck")表示的是有不少的p標籤,我在選出的這麼多p標籤中,找到其內部知足class=fuck的其餘標籤
"""
print(p("div").filter(".s1"))
"""

"""
print(p("div").find(".s1"))
"""
<p class="s1">古明地戀</p>
    
"""
# 能夠看到p("div").filter(".s1")是空的,由於這表示在選出來的div標籤中,找出class=s1的div
# 而p("div").find(".s1")表示找到div裏面知足class=s1的其餘標籤

# filter和find能夠無限使用的,由於返回的都是一個PyQuery類型
# p("div p .cls li a") == p("div").find("p").find(".cls").find("li").find("a")

獲取屬性

from pyquery import PyQuery


html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>古明地覺</title>
</head>
<body>
    <p id="bili"><a href="http://www.bilibili.com">想進入基佬的大門嗎?還等什麼,快點擊吧</a></p>
    <p class="s1">my name is satori</p>
    <div>
        <p class="s1">古明地戀</p>
    </div>
    <table >
        <tbody>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr class="tr">
                <td>密碼:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
    <a href="http://www.baidu.com" target="_blank">百度</a>
    <a href="http://www.yahoo.com">雅虎</a>
</body>
</html>   
'''

p = PyQuery(html)

a_tag = p("a")
print(a_tag.attr("href"))  # http://www.bilibili.com

"""
能夠直接調用attr方法,傳入要獲取的屬性值便可。
可是注意到即使知足條件的標籤有多個,和html同樣,調用attr獲取的時候只會獲得第一個
"""
# 所以可使用eq
print(p("a").eq(0).attr("href"))  # http://www.bilibili.com
print(p("a").eq(1).attr("href"))  # http://www.baidu.com

# 可是還有一個問題,就是咱們不知道得到了幾個p標籤
# 難道要一個一個的數嗎?
# 固然不用,一種笨的方法,就是我不斷的循環,若是沒有內容了就break
# 可是PyQuery內部給咱們提供了一個items方法,能夠自動的迭代,若是迭代完畢自動退出。
for i in p("a").items():
    print(i.attr("href"))
"""
http://www.baidu.com
http://www.yahoo.com
"""
相關文章
相關標籤/搜索