lxml 底層C語言實現 高效地處理html

2022-08-18 16:06:15 字數 2102 閱讀 2871

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屬性的標籤即可

python

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...