pyquery是一個專門用來解析html的庫,從名字很容易想到jQuery,沒錯,這徹底是仿照jQuery的語法實現的。若是用過jQuery,俺麼pyquery很容易實現
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的全部元素 '''
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 """