python lxml包學習筆記

2021-07-09 06:21:15 字數 3403 閱讀 1073

python lxml包用於解析xml和html檔案,可以使用xpath和css定位元素,個人認為相對於beautifulsoup功能更加強大,更加靈活。本文根據lxml官方文件和自己的理解列出常用的函式, 本文**為python3.4, lxml2.0

lxml:

支援:python2 python3

匯入xml字串有多種方式,我最長使用的是 lxml.etree.xml(xml字串), etree.fromstring(xml字串)也可以

import lxml.etree 

import urllib.request

from lxml.etree import *

str_url = ''

request = urllib.request.request(str_url)

xml_text = urllib.request.urlopen(request).read()

root = lxml.etree.xml(xml_text) # xml_text 為xml純文字檔案

root 為lxml.etree._element 物件,含有多個函式

root 含有find,findall, xpath,get,getchildren函式, 重點請help(root)

# example  獲取雜誌名稱和issn

# 使用 tag作為輸入需要逐級進行

journal_name = root.find('pubmedarticle').find('medlinecitation').find('article').find('journal').find('title').text

print('tag:', journal_name)

tag: cognitive computation
# 也可以使用xpath(必須使用相對路徑,以.//開頭,如果想使用絕對路徑可以使用xpath函式)

journal_name = root.find('.//title').text

print('xpath:' ,journal_name)

xpath: cognitive computation
# text是element物件的屬性,可以得到內部的內容,如果要得到標籤內部的屬性

#使用get函式

# 比如得到 1866-9956的 issntype屬性,則可以使用get函式

issn_attr = root.find('.//issn').get('issntype')

print('issn attr:', issn_attr)

issn attr: print
# 使用tostring函式

# 可以得到改標籤下的全部內容,tostring函式是 lxml.etree 下的靜態函式,使用前需要 from lxml.etree import *

tostring(root.find('.//journalissue')) # 得到journalissue標籤下的全部內容

b'\n                    7\n                    6\n                    \n                        2015\n                    \n                \n                '
具體xpath的學習可以參考

xpath與findall類似也返回乙個list,不同之處是只能使用xpath,而且可以使用xpath的相對路徑和絕對路徑

journal_name = root.xpath('//title')[0].text

print(journal_name)

cognitive computation
得到所有直接子元素

注意,使用findall,find,xpath時一定要確定元素是否存在(可以用 if 判斷),然後才讀取text屬性,否則會遇到 type 『nonetype』 cannot be serialized., list index out of range, 『nonetype』 object has no attribute 『text』這樣的錯誤。

除了上述讀取的函式,lxml還包含了很多設定的函式,功能強大,具體可以去看lxml官方文件

import lxml.html

str_url = ''

request = urllib.request.request(str_url)

html_text = urllib.request.urlopen(request).read()

root = lxml.html.fromstring(html_text)

# 獲取本頁面所有專案名稱

movies_list = [a.text for a in root.cssselect('div.billboard-bd tr td a')]

print(movies_list)

['老炮兒', '八惡人', '卡羅爾', '海街日記', '荒野獵人', '尋龍訣', '丹麥女孩', '龍蝦', '邊境殺手', '實習生']
# 獲取所有電影超連結

movies_href = [a.get('href') for a in root.cssselect('div.billboard-bd tr td a')]

print(movies_href)

['subject/24751756/', 'subject/25787888/', 'subject/10757577/', 'subject/25895901/', 'subject/5327268/', 'subject/3077412/', 'subject/3071604/', 'subject/20514947/', 'subject/25881247/', 'subject/10594965/']
text_content() 可以返回改element下的所有文字(去除所有<>標籤)

.make_links_absolute(base_href, resolve_base_href=true) 有時候遇到的鏈結是相對路徑,可以使用該函式將相對路徑轉換為絕對路徑

.rewrite_links(link_repl_func, resolve_base_href=true, base_href=none)根據替換函式替換鏈結

閉包學習筆記

作用域的定義 變數起作用的範圍 區域性變數的作用域是它自己所在的函式及其巢狀函式 示例1 function getcounter var counter getcounter counter counter counter 釋放閉包與它的環境 counter null counter getcoun...

凸包學習筆記

凸包 凸包 convex hull 是乙個計算幾何 圖形學 中的概念。在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用x內所有點 x1,xn 的線性組合來構造.在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。用不嚴謹的話來講,給定二維平面上...

Python學習筆記 包

包用於將一組模組歸併到乙個目錄中,此目錄即為包,目錄名即為包名 1.包是乙個有層次的檔案目錄結構,它定義了乙個由模組和 子包組成的python應用程式執行環境 2.基於包,python在執行模組匯入時可以指定模組的匯入路徑 import 目錄名.目錄名 模組名 import dir1 dir2 mo...