国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---30、解析庫(kù)的使用:PyQuery

IntMain / 3512人閱讀

摘要:父節(jié)點(diǎn)我們可以用方法來(lái)獲取某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),我們用一個(gè)實(shí)例來(lái)感受一下運(yùn)行結(jié)果在這里我們首先用選取了為的節(jié)點(diǎn),然后調(diào)用了方法,得到其父節(jié)點(diǎn),類(lèi)型依然是類(lèi)型。

上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---29、解析庫(kù)的使用:BeautifulSoup
下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---31、數(shù)據(jù)存儲(chǔ):文件存儲(chǔ)

在上一節(jié)我們介紹了 BeautifulSoup 的使用,它是一個(gè)非常強(qiáng)大的網(wǎng)頁(yè)解析庫(kù),可有沒(méi)有覺(jué)得它的一些方法使用有點(diǎn)不適應(yīng)?有沒(méi)有覺(jué)得它的 CSS 選擇器功能沒(méi)有那么強(qiáng)大?

如果你對(duì) Web 有所涉及,如果你比較喜歡用 CSS 選擇器,如果你對(duì) jQuery 有所了解,那么這里有一個(gè)更適合你的解析庫(kù)—— PyQuery。

接下來(lái)我們就來(lái)感受一下 PyQuery 的強(qiáng)大之處。

1. 準(zhǔn)備工作

在開(kāi)始之前請(qǐng)確保已經(jīng)正確安裝好了 PyQuery,如沒(méi)有安裝可以參考第一章的安裝過(guò)程。

2. 初始化

像 BeautifulSoup 一樣,PyQuery 初始化的時(shí)候也需要傳入 HTML 數(shù)據(jù)源來(lái)初始化一個(gè)操作對(duì)象,它的初始化方式有多種,比如直接傳入字符串,傳入 URL,傳文件名。下面我們來(lái)詳細(xì)介紹一下。

字符串初始化

首先我們用一個(gè)實(shí)例來(lái)感受一下:

html = """

"""
from pyquery import PyQuery as pq
doc = pq(html)
print(doc("li"))

運(yùn)行結(jié)果:

  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 在這里我們首先引入了 PyQuery 這個(gè)對(duì)象,取別名為 pq,然后聲明了一個(gè)長(zhǎng) HTML 字符串,當(dāng)作參數(shù)傳遞給 PyQuery,這樣就成功完成了初始化,然后接下來(lái)將初始化的對(duì)象傳入 CSS 選擇器,在這個(gè)實(shí)例中我們傳入 li 節(jié)點(diǎn),這樣就可以選擇所有的 li 節(jié)點(diǎn),打印輸出可以看到所有的 li 節(jié)點(diǎn)的 HTML 文本。

    URL初始化

    初始化的參數(shù)不僅可以以字符串的形式傳遞,還可以傳入網(wǎng)頁(yè)的 URL,在這里只需要指定參數(shù)為 url 即可:

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

    運(yùn)行結(jié)果:

    SegmentFault 思否

    這樣的話(huà) PyQuery 會(huì)首先請(qǐng)求這個(gè) URL,然后用得到的 HTML 內(nèi)容完成初始化,其實(shí)就相當(dāng)于我們用網(wǎng)頁(yè)的源代碼以字符串的形式傳遞給 PyQuery 來(lái)初始化。

    它與下面的功能是相同的:

    from pyquery import PyQuery as pq
    import requests
    doc = pq(requests.get("http://www.segmentfault.com").text)
    print(doc("title"))
    文件初始化

    當(dāng)然除了傳遞一個(gè) URL,還可以傳遞本地的文件名,參數(shù)指定為 filename 即可:

    from pyquery import PyQuery as pq
    doc = pq(filename="demo.html")
    print(doc("li"))

    當(dāng)然在這里需要有一個(gè)本地 HTML 文件 demo.html,內(nèi)容是待解析的 HTML 字符串。這樣它會(huì)首先讀取本地的文件內(nèi)容,然后用文件內(nèi)容以字符串的形式傳遞給 PyQuery 來(lái)初始化。

    以上三種初始化方式均可,當(dāng)然最常用的初始化方式還是以字符串形式傳遞。

    3. 基本CSS選擇器

    我們首先用一個(gè)實(shí)例來(lái)感受一下 PyQuery 的 CSS 選擇器的用法:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(doc("#container .list li"))
    print(type(doc("#container .list li")))

    運(yùn)行結(jié)果:

  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 在這里我們初始化 PyQuery 對(duì)象之后,傳入了一個(gè) CSS 選擇器,#container .list li,意思是選取 id 為 container 的節(jié)點(diǎn)內(nèi)部的 class 為 list 的節(jié)點(diǎn)內(nèi)部的所有 li 節(jié)點(diǎn)。然后打印輸出,可以看到成功獲取到了符合條件的節(jié)點(diǎn)。

    然后我們將它的類(lèi)型打印輸出,可以看到它的類(lèi)型依然是 PyQuery類(lèi)型。

    4. 查找節(jié)點(diǎn)

    下面我們介紹一些常用的查詢(xún)函數(shù),這些函數(shù)和 jQuery 中的函數(shù)用法也完全相同。

    子節(jié)點(diǎn)

    查找子節(jié)點(diǎn)需要用到 find() 方法,傳入的參數(shù)是 CSS 選擇器,我們還是以上面的 HTML 為例:

    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc(".list")
    print(type(items))
    print(items)
    lis = items.find("li")
    print(type(lis))
    print(lis)

    運(yùn)行結(jié)果:

    
    
    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 首先我們選取了 class 為 list 的節(jié)點(diǎn),然后我們調(diào)用了 find() 方法,傳入了 CSS 選擇器,選取其內(nèi)部的 li 節(jié)點(diǎn),最后都打印輸出即可觀(guān)察到對(duì)應(yīng)的查詢(xún)結(jié)果,可以發(fā)現(xiàn) find() 方法會(huì)將符合條件的所有節(jié)點(diǎn)選擇出來(lái),結(jié)果的類(lèi)型是 PyQuery 類(lèi)型。

    其實(shí) find() 的查找范圍是節(jié)點(diǎn)的所有子孫節(jié)點(diǎn),而如果我們只想查找子節(jié)點(diǎn),那可以用 children() 方法:

    lis = items.children()
    print(type(lis))
    print(lis)

    運(yùn)行結(jié)果:

    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 如果要篩選所有子節(jié)點(diǎn)中符合條件的節(jié)點(diǎn),比如我們想篩選出子節(jié)點(diǎn)中 class 為 active 的節(jié)點(diǎn),可以向 children() 方法傳入 CSS 選擇器 .active:

    lis = items.children(".active")
    print(lis)

    運(yùn)行結(jié)果:

  • third item
  • fourth item
  • 可以看到輸出的結(jié)果已經(jīng)做了篩選,留下了 class 為 active 的節(jié)點(diǎn)。

    父節(jié)點(diǎn)

    我們可以用 parent() 方法來(lái)獲取某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),我們用一個(gè)實(shí)例來(lái)感受一下:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc(".list")
    container = items.parent()
    print(type(container))
    print(container)

    運(yùn)行結(jié)果:

    
    

    在這里我們首先用 .list 選取了 class 為 list 的節(jié)點(diǎn),然后調(diào)用了 parent() 方法,得到其父節(jié)點(diǎn),類(lèi)型依然是 PyQuery 類(lèi)型。

    這里的父節(jié)點(diǎn)是該節(jié)點(diǎn)的直接父節(jié)點(diǎn),也就是說(shuō),它不會(huì)再去查找父節(jié)點(diǎn)的父節(jié)點(diǎn),即祖先節(jié)點(diǎn)。

    但是如果我們想獲取某個(gè)祖先節(jié)點(diǎn)怎么辦呢?可以用 parents() 方法:

    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc(".list")
    parents = items.parents()
    print(type(parents))
    print(parents)

    運(yùn)行結(jié)果:

    
    
     

    在這里我們調(diào)用了 parents() 方法,可以看到輸出結(jié)果有兩個(gè),一個(gè)是 class 為 wrap 的節(jié)點(diǎn),一個(gè)是 id 為 container 的節(jié)點(diǎn),也就是說(shuō),parents() 方法會(huì)返回所有的祖先節(jié)點(diǎn)。

    如果我們想要篩選某個(gè)祖先節(jié)點(diǎn)的話(huà)可以向 parents() 方法傳入 CSS 選擇器,這樣就會(huì)返回祖先節(jié)點(diǎn)中符合 CSS 選擇器的節(jié)點(diǎn):

    parent = items.parents(".wrap")
    print(parent)

    運(yùn)行結(jié)果:

    可以看到輸出結(jié)果就少了一個(gè)節(jié)點(diǎn),只保留了 class 為 wrap 的節(jié)點(diǎn)。

    兄弟節(jié)點(diǎn)

    在上面我們說(shuō)明了子節(jié)點(diǎn)和父節(jié)點(diǎn)的用法,還有一種節(jié)點(diǎn)那就是兄弟節(jié)點(diǎn),如果要獲取兄弟節(jié)點(diǎn)可以使用 siblings() 方法。我們還是以上面的 HTML 代碼為例來(lái)感受一下:

    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".list .item-0.active")
    print(li.siblings())

    在這里我們首先選擇了 class 為 list 的節(jié)點(diǎn)內(nèi)部的 class 為 item-0 和 active 的節(jié)點(diǎn),也就是第三個(gè) li 節(jié)點(diǎn)。那么很明顯它的兄弟節(jié)點(diǎn)有四個(gè),那就是第一、二、四、五個(gè) li 節(jié)點(diǎn)。

    運(yùn)行結(jié)果:

  • second item
  • first item
  • fourth item
  • fifth item
  • 可以看到運(yùn)行結(jié)果也正是我們剛才所說(shuō)的四個(gè)兄弟節(jié)點(diǎn)。

    如果要篩選某個(gè)兄弟節(jié)點(diǎn),我們依然可以向方法傳入 CSS 選擇器,這樣就會(huì)從所有兄弟節(jié)點(diǎn)中挑選出符合條件的節(jié)點(diǎn)了:

    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".list .item-0.active")
    print(li.siblings(".active"))

    在這里我們篩選了 class 為 active 的節(jié)點(diǎn),通過(guò)剛才的結(jié)果我們可以觀(guān)察到 class 為 active 的兄弟節(jié)點(diǎn)只有第四個(gè) li 節(jié)點(diǎn),所以結(jié)果應(yīng)該是一個(gè)。

    運(yùn)行結(jié)果:

  • fourth item
  • 5. 遍歷

    我們剛才可以觀(guān)察到,PyQuery 的選擇結(jié)果可能是多個(gè)節(jié)點(diǎn),可能是單個(gè)節(jié)點(diǎn),類(lèi)型都是 PyQuery 類(lèi)型,并沒(méi)有返回像 BeautifulSoup 一樣的列表。

    對(duì)于單個(gè)節(jié)點(diǎn)來(lái)說(shuō),我們可以直接打印輸出,也可直接轉(zhuǎn)成字符串:

    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".item-0.active")
    print(li)
    print(str(li))

    運(yùn)行結(jié)果:

  • third item
  • third item
  • 對(duì)于多個(gè)節(jié)點(diǎn)的結(jié)果,我們就需要遍歷來(lái)獲取了,例如這里我們把每一個(gè) li 節(jié)點(diǎn)進(jìn)行遍歷,,需要調(diào)用 items() 方法:

    from pyquery import PyQuery as pq
    doc = pq(html)
    lis = doc("li").items()
    print(type(lis))
    for li in lis:
        print(li, type(li))

    運(yùn)行結(jié)果:

    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 在這里我們可以發(fā)現(xiàn)調(diào)用 items() 方法后,會(huì)得到一個(gè)生成器,遍歷一下,就可以逐個(gè)得到 li 節(jié)點(diǎn)對(duì)象了,它的類(lèi)型也是 PyQuery 類(lèi)型,所以每個(gè) li 節(jié)點(diǎn)還可以調(diào)用前面所說(shuō)的方法進(jìn)行選擇,比如繼續(xù)查詢(xún)子節(jié)點(diǎn),尋找某個(gè)祖先節(jié)點(diǎn)等等,非常靈活。

    6. 獲取信息

    提取到節(jié)點(diǎn)之后,我們的最終目的當(dāng)然是提取節(jié)點(diǎn)所包含的信息了,比較重要的信息有兩類(lèi),一是獲取屬性,二是獲取文本,下面我們分別進(jìn)行說(shuō)明。

    獲取屬性

    提取到某個(gè) PyQuery 類(lèi)型的節(jié)點(diǎn)之后,我們可以調(diào)用 attr() 方法來(lái)獲取屬性:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    a = doc(".item-0.active a")
    print(a, type(a))
    print(a.attr("href"))

    運(yùn)行結(jié)果:

    third item 
    link3.html

    在這里我們首先選中了 class 為 item-0 和 active 的 li 節(jié)點(diǎn)內(nèi)的 a 節(jié)點(diǎn),它的類(lèi)型可以看到是 PyQuery 類(lèi)型。

    然后我們調(diào)用了 attr() 方法,然后傳入屬性的名稱(chēng),就可以得到這個(gè)屬性值了。

    也可以通過(guò)調(diào)用 attr 屬性來(lái)獲取屬性,用法如下:

    print(a.attr.href)

    結(jié)果:

    link3.html

    結(jié)果是完全一樣的,在這里我們沒(méi)有調(diào)用方法,而是調(diào)用了 attr 屬性,然后再調(diào)用屬性名,同樣可以得到屬性值。

    如果我們選中的是多個(gè)元素,然后調(diào)用 attr() 方法會(huì)出現(xiàn)怎樣的結(jié)果?我們用一個(gè)實(shí)例來(lái)測(cè)試一下:

    a = doc("a")
    print(a, type(a))
    print(a.attr("href"))
    print(a.attr.href)

    運(yùn)行結(jié)果:

    second itemthird itemfourth itemfifth item 
    link2.html
    link2.html

    照理來(lái)說(shuō)我們選中的 a 節(jié)點(diǎn)應(yīng)該有四個(gè),而且打印結(jié)果也是四個(gè),但是當(dāng)我們調(diào)用 attr() 方法時(shí),返回的結(jié)果卻只是第一個(gè)。

    所以當(dāng)返回結(jié)果包含多個(gè)節(jié)點(diǎn)時(shí),調(diào)用 attr() 方法只會(huì)得到第一個(gè)節(jié)點(diǎn)的屬性。

    那么遇到這種情況如果我們想獲取所有的 a 節(jié)點(diǎn)的屬性,就需要用到上文所說(shuō)的遍歷了:

    from pyquery import PyQuery as pq
    doc = pq(html)
    a = doc("a")
    for item in a.items():
        print(item.attr("href"))

    運(yùn)行結(jié)果:

    link2.html
    link3.html
    link4.html
    link5.html

    所以,在進(jìn)行屬性獲取的時(shí)候觀(guān)察一下返回節(jié)點(diǎn)是一個(gè)還是多個(gè),如果是多個(gè),則需要遍歷才能依次獲取每個(gè)節(jié)點(diǎn)的屬性。

    獲取文本

    獲取節(jié)點(diǎn)之后的另一個(gè)主要的操作就是獲取其內(nèi)部的文本了,我們可以調(diào)用 text() 方法來(lái)獲?。?/p>

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    a = doc(".item-0.active a")
    print(a)
    print(a.text())

    運(yùn)行結(jié)果:

    third item
    third item

    我們首先選中了一個(gè) a 節(jié)點(diǎn),然后調(diào)用了 text() 方法,就可以獲取其內(nèi)部的文本信息了,它會(huì)忽略掉節(jié)點(diǎn)內(nèi)部包含的所有 HTML,只返回純文字內(nèi)容。

    但如果我們想要獲取這個(gè)節(jié)點(diǎn)內(nèi)部的 HTML 文本,就可以用 html() 方法:

    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".item-0.active")
    print(li)
    print(li.html())

    這里我們選中了第三個(gè) li 節(jié)點(diǎn),然后調(diào)用了 html() 方法,它返回的結(jié)果應(yīng)該是li節(jié)點(diǎn)內(nèi)的所有 HTML 文本。

    運(yùn)行結(jié)果:

    third item

    這里同樣有一個(gè)問(wèn)題,如果我們選中的結(jié)果是多個(gè)節(jié)點(diǎn),text() 或 html() 會(huì)返回什么內(nèi)容?

    我們用一個(gè)實(shí)例來(lái)看一下:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc("li")
    print(li.html())
    print(li.text())
    print(type(li.text())

    運(yùn)行結(jié)果:

    second item
    second item third item fourth item fifth item
    

    結(jié)果可能比較出乎意料,我們選中的是所有的 li 節(jié)點(diǎn),可以發(fā)現(xiàn) html() 方法返回的是第一個(gè) li 節(jié)點(diǎn)的內(nèi)部 HTML 文本,而 text() 則返回了所有的 li 節(jié)點(diǎn)內(nèi)部純文本,中間用一個(gè)空格分割開(kāi),實(shí)際上是一個(gè)字符串。

    所以這個(gè)地方值得注意,如果我們得到的結(jié)果是多個(gè)節(jié)點(diǎn),如果要獲取每個(gè)節(jié)點(diǎn)的內(nèi)部 HTML 文本,則需要遍歷每個(gè)節(jié)點(diǎn),而 text() 方法不需要遍歷就可以獲取,它是將所有節(jié)點(diǎn)取文本之后合并成一個(gè)字符串。

    7. 節(jié)點(diǎn)操作

    PyQuery 提供了一系列方法來(lái)對(duì)節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)修改操作,比如為某個(gè)節(jié)點(diǎn)添加一個(gè) class,移除某個(gè)節(jié)點(diǎn)等等,這些操作有時(shí)候會(huì)為提取信息帶來(lái)極大的便利。

    由于節(jié)點(diǎn)操作的方法太多,下面舉幾個(gè)典型的例子來(lái)說(shuō)明它的用法。

    addClass、removeClass

    我們先用一個(gè)實(shí)例來(lái)感受一下:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".item-0.active")
    print(li)
    li.removeClass("active")
    print(li)
    li.addClass("active")
    print(li)

    首先我們選中了第三個(gè) li 節(jié)點(diǎn),然后調(diào)用了 removeClass() 方法,將 li 節(jié)點(diǎn)的 active 這個(gè) class 移除,后來(lái)又調(diào)用了 addClass() 方法,又將 class 添加回來(lái),每執(zhí)行一次操作,就打印輸出一下當(dāng)前 li 節(jié)點(diǎn)的內(nèi)容。

    運(yùn)行結(jié)果:

  • third item
  • third item
  • third item
  • 可以看到一共進(jìn)行了三次輸出,第二次輸出 li 節(jié)點(diǎn)的 active 這個(gè) class 被移除了,第三次 class 又添加回來(lái)了。

    所以說(shuō)我們 addClass()、removeClass() 這些方法可以動(dòng)態(tài)地改變節(jié)點(diǎn)的 class 屬性。

    attr、text、html

    當(dāng)然除了操作 class 這個(gè)屬性,也有 attr() 方法來(lái)專(zhuān)門(mén)針對(duì)屬性進(jìn)行操作,也可以用 text()、html() 方法來(lái)改變節(jié)點(diǎn)內(nèi)部的內(nèi)容。

    我們用實(shí)例感受一下:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc(".item-0.active")
    print(li)
    li.attr("name", "link")
    print(li)
    li.text("changed item")
    print(li)
    li.html("changed item")
    print(li)

    在這里我們首先選中了 li 節(jié)點(diǎn),然后調(diào)用 attr() 方法來(lái)修改屬性,第一個(gè)參數(shù)為屬性名,第二個(gè)參數(shù)為屬性值,然后我們調(diào)用了 text() 和 html() 方法來(lái)改變節(jié)點(diǎn)內(nèi)部的內(nèi)容。三次操作后分別又打印輸出當(dāng)前 li 節(jié)點(diǎn)。

    運(yùn)行結(jié)果:

  • third item
  • third item
  • changed item
  • changed item
  • 可以發(fā)現(xiàn),調(diào)用 attr() 方法后,li 節(jié)點(diǎn)多了一個(gè)原本不存在的屬性 name,其值為 link,調(diào)用 text() 方法,傳入文本之后,發(fā)現(xiàn) li 節(jié)點(diǎn)內(nèi)部的文本就全被改變?yōu)閭魅氲淖址谋玖?。調(diào)用 html() 方法傳入 HTML 文本之后,li 節(jié)點(diǎn)內(nèi)部又改變?yōu)閭魅氲?HTML 文本。

    所以說(shuō),attr() 方法如果只傳入第一個(gè)參數(shù)屬性名,則是獲取這個(gè)屬性值,如果傳入第二個(gè)參數(shù),可以用來(lái)修改屬性值,text() 和 html() 方法如果不傳參數(shù)是獲取節(jié)點(diǎn)內(nèi)純文本和 HTML 文本,如果傳入?yún)?shù)則是進(jìn)行賦值。

    remove

    remove 顧名思義移除,remove() 方法有時(shí)會(huì)為信息的提取帶來(lái)非常大的便利。下面我們看一個(gè)實(shí)例:

    html = """
    
    Hello, World

    This is a paragraph.

    """ from pyquery import PyQuery as pq doc = pq(html) wrap = doc(".wrap") print(wrap.text())

    在這里有一段 HTML 文本,我們現(xiàn)在想提取 Hello, World 這個(gè)字符串,而不要 p 節(jié)點(diǎn)內(nèi)部的字符串,這個(gè)怎樣來(lái)提取?

    在這里我們直接先嘗試提取 class 為 wrap 的節(jié)點(diǎn)的內(nèi)容,看看是不是我們想要的,運(yùn)行結(jié)果如下:

    Hello, World This is a paragraph.

    然而這個(gè)結(jié)果還包含了內(nèi)部的 p 節(jié)點(diǎn)的內(nèi)容,也就是說(shuō) text() 把所有的純文本全提取出來(lái)了。如果我們想去掉 p 節(jié)點(diǎn)內(nèi)部的文本,可以選擇再把 p 節(jié)點(diǎn)內(nèi)的文本提取一遍,然后從整個(gè)結(jié)果中移除這個(gè)子串,但這個(gè)做法明顯比較繁瑣。

    那這是 remove() 方法就可以派上用場(chǎng)了,我們可以接著這么做:

    wrap.find("p").remove()
    print(wrap.text())

    我們首先選中了 p 節(jié)點(diǎn),然后調(diào)用了 remove() 方法將其移除,然后這時(shí) wrap 內(nèi)部就只剩下 Hello, World 這句話(huà)了,然后再利用 text()方 法提取即可。

    所以說(shuō),remove() 方法可以刪除某些冗余內(nèi)容,來(lái)方便我們的提取。在適當(dāng)?shù)臅r(shí)候使用可以極大地提高效率。

    另外其實(shí)還有很多節(jié)點(diǎn)操作的方法,比如 append()、empty()、prepend() 等方法,他們和 jQuery 的用法是完全一致的,詳細(xì)的用法可以參考官方文檔:http://pyquery.readthedocs.io...

    8. 偽類(lèi)選擇器

    CSS 選擇器之所以強(qiáng)大,還有一個(gè)很重要的原因就是它支持多種多樣的偽類(lèi)選擇器。例如選擇第一個(gè)節(jié)點(diǎn)、最后一個(gè)節(jié)點(diǎn)、奇偶數(shù)節(jié)點(diǎn)、包含某一文本的節(jié)點(diǎn)等等,我們用一個(gè)實(shí)例感受一下:

    html = """
    
    """
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc("li:first-child")
    print(li)
    li = doc("li:last-child")
    print(li)
    li = doc("li:nth-child(2)")
    print(li)
    li = doc("li:gt(2)")
    print(li)
    li = doc("li:nth-child(2n)")
    print(li)
    li = doc("li:contains(second)")
    print(li)

    在這里我們使用了 CSS3 的偽類(lèi)選擇器,依次選擇了第一個(gè) li 節(jié)點(diǎn)、最后一個(gè) li 節(jié)點(diǎn)、第二個(gè) li 節(jié)點(diǎn)、第三個(gè) li 之后的 li 節(jié)點(diǎn)、偶數(shù)位置的 li 節(jié)點(diǎn)、包含 second 文本的 li 節(jié)點(diǎn),功能十分強(qiáng)大。

    更多的 CSS 選擇器的用法可以參考:http://www.w3school.com.cn/cs...

    9. 結(jié)語(yǔ)

    到此為止 PyQuery 的常用用法就介紹完了,如果想查看更多的內(nèi)容可以參考一下 PyQuery 的官方文檔:http://pyquery.readthedocs.io,相信有了它,解析網(wǎng)頁(yè)不再是難事。

    上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---29、解析庫(kù)的使用:BeautifulSoup
    下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---31、數(shù)據(jù)存儲(chǔ):文件存儲(chǔ)

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44082.html

    相關(guān)文章

    • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---4、數(shù)據(jù)庫(kù)的安裝:MySQL、MongoDB、Redis

      摘要:運(yùn)行結(jié)果如果運(yùn)行結(jié)果一致則證明安裝成功。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)請(qǐng)求庫(kù)安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)數(shù)據(jù)庫(kù)的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---2、請(qǐng)求庫(kù)安裝:GeckoDriver、PhantomJS、Aiohttp下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---數(shù)據(jù)庫(kù)的安裝:MySQL、MongoDB、Redis 抓取下網(wǎng)頁(yè)代碼之后,下一步就是從網(wǎng)頁(yè)中提取信息,提取信息的方式有...

      xbynet 評(píng)論0 收藏0
    • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---4、數(shù)據(jù)庫(kù)的安裝:MySQL、MongoDB、Redis

      摘要:的安裝是一個(gè)輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),以表的形式來(lái)存儲(chǔ)數(shù)據(jù),本節(jié)我們來(lái)了解下它的安裝方式。相關(guān)鏈接官方網(wǎng)站下載地址中文教程下的安裝推薦使用安裝,執(zhí)行命令即可。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)存儲(chǔ)庫(kù)的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---3、解析庫(kù)的安裝:LXML、BeautifulSoup、PyQuery、Tesserocr下一篇文章:Python3網(wǎng)絡(luò)...

      winterdawn 評(píng)論0 收藏0
    • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---31、數(shù)據(jù)存儲(chǔ):文件存儲(chǔ)

      摘要:如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。運(yùn)行結(jié)果以上是讀取文件的方法。為了輸出中文,我們還需要指定一個(gè)參數(shù)為,另外規(guī)定文件輸出的編碼。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---30、解析庫(kù)的使用:PyQuery下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---32、數(shù)據(jù)存儲(chǔ):關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ):MySQL 我們用解析器解析出數(shù)據(jù)之后,接下來(lái)的一步就是對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)了,保存的形式可以...

      dreamans 評(píng)論0 收藏0
    • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---2、請(qǐng)求庫(kù)安裝:GeckoDriver、PhantomJS、Aioh

      摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)請(qǐng)求庫(kù)安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的安裝的安裝在上一節(jié)我們了解了的配置方法,配置完成之后我們便可以用來(lái)驅(qū)動(dòng)瀏覽器來(lái)做相應(yīng)網(wǎng)頁(yè)的抓取。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)請(qǐng)求庫(kù)安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---1、請(qǐng)求庫(kù)安裝:Requests、Selenium、ChromeDriver下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)--...

      Cristalven 評(píng)論0 收藏0
    • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---29、解析庫(kù)的使用:BeautifulSoup

      摘要:解析器在解析的時(shí)候?qū)嶋H上是依賴(lài)于解析器的,它除了支持標(biāo)準(zhǔn)庫(kù)中的解析器,還支持一些第三方的解析器比如,下面我們對(duì)支持的解析器及它們的一些優(yōu)缺點(diǎn)做一個(gè)簡(jiǎn)單的對(duì)比。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---28、解析庫(kù)的使用:XPath下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---30、解析庫(kù)的使用:PyQuery 前面我們介紹了正則表達(dá)式的相關(guān)用法,但是一旦正則寫(xiě)的有問(wèn)題,可能得到的就...

      MockingBird 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <