lxml也是乙個用於篩選指定html內容的模組,pyquery就是基於lxml。
使用lxml主要需要了解xpath
我們可能注意到:@href、@class、text()前面只有乙個/,如果是兩個/的話,比如div標籤,它裡面是沒有href屬性的。但是div裡面有a標籤,a標籤裡面有href屬性,所以我們仍然可以通過//div//@href去獲取,此時獲取的是裡面的a標籤裡面的href,但是//div/@href是獲取不到的,因為//div/@href表示的是獲取div標籤裡面的href,而div沒有href屬性。
因此如果是/@href,那麼前面必須是有href屬性的標籤,否則獲取不到。但如果是//@href的話,前面的標籤就沒有太多要求了,可以是p標籤,也可以是div標籤,只要裡面有具有href屬性的標籤即可
from lxml import etree
import requests
res = requests.get("",
# 呼叫etree內部的html方法,將html文字傳進去,便得到乙個可以進行xpath的物件
# 我們可以呼叫etree.tostring(html),會得到乙個位元組物件,再解碼會得到字串,這裡就不演示了。
html = etree.html(res.text)
# 找出class屬性等於"toindex"的a標籤
result = html.xpath("//a[@class='toindex']")
for res in result:
# 列印的結果是乙個標籤
print(res) # # 可以呼叫tostring轉成位元組
print(etree.tostring(res)) # b'百度首頁'
print(str(etree.tostring(res), encoding="utf-8")) # 百度首頁
# 內部還有乙個etree.parse()方法,可以直接傳入html檔案或者xml檔案的路徑,進行解析
# 獲取一下內部屬性
result = html.xpath("//a[@class='toindex']/@href")
# 由於標籤只有乙個,所以列表裡面只有乙個元素
print(result) # ['/']
result = html.xpath("//a[@class='toindex']/@class")
print(result) # ['toindex']
result = html.xpath("//a[@class='toindex']/text()")
# 可以看到此時的result又都不是標籤了,這是為什麼?
# 如果我們不選擇href、class等具體屬性的話,那麼得到的是乙個標籤,如果選擇屬性那麼得到是字串
# 因為不止乙個標籤,所以會將所有的字串組合成乙個列表
# 即便只有乙個元素,得到依舊是乙個列表
result = html.xpath("//div[contains(@class, 'tab_inner')]")
# 現在獲取的result裡面只有乙個元素
for res in result:
print(res) # print(etree.tostring(res)) # b'\n網頁\n # 我們看到了,如果不是獲取href、class、text等屬性的時候,得到的依舊是乙個element物件,這就意味著我們可以繼續使用xpath
titles = res.xpath(".//a/text()") # 注意這裡是.//不是//,因為我們要在當前元素的子孫中去查詢
# 我們試試不加.
titles = res.xpath("//a/text()")
# 可以看到內容就多了,因為即便是res.xpath,但指定//的話依舊會在全域性html頁面中查詢
print(titles)
""""""
# 進一步證實了兩者結果是一樣的
print(res.xpath("//a/text()") == html.xpath("//a/text()")) # true
lxml 底層C語言實現 高效地處理html
lxml也是乙個用於篩選指定html內容的模組,pyquery就是基於lxml。使用lxml主要需要了解xpath 我們可能注意到 href class text 前面只有乙個 如果是兩個 的話,比如div標籤,它裡面是沒有href屬性的。但是div裡面有a標籤,a標籤裡面有href屬性,所以我們仍...
最高效的回文數(C語言實現)
判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。例如 12321 就是乙個回文數 我們先考慮 符數不能是回文數 例如 121 倒序之後是121 不符合 10的整數倍不能是回文數 例如 10 100 1000 等 那麼我們接下來先考慮一下如何解決這個問題 我們可...
C語言實現memcpy
memcpy和memmove都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊 的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。程式設計師面試寶典中有例題 對應的原型如下 v...