Python大數(shù)據(jù)之使用lxml庫(kù)解析html網(wǎng)頁(yè)文件示例
本文實(shí)例講述了Python大數(shù)據(jù)之使用lxml庫(kù)解析html網(wǎng)頁(yè)文件。分享給大家供大家參考,具體如下:
lxml是Python的一個(gè)html/xml解析并建立dom的庫(kù),lxml的特點(diǎn)是功能強(qiáng)大,性能也不錯(cuò),xml包含了ElementTree ,html5lib ,beautfulsoup 等庫(kù)。
使用lxml前注意事項(xiàng):先確保html經(jīng)過了utf-8解碼,即code =html.decode('utf-8', 'ignore')
,否則會(huì)出現(xiàn)解析出錯(cuò)情況。因?yàn)橹形谋痪幋a成utf-8之后變成 '/u2541' 之類的形式,lxml一遇到 "/"就會(huì)認(rèn)為其標(biāo)簽結(jié)束。
具體用法:元素節(jié)點(diǎn)操作
1、 解析HTMl建立DOM
from lxml import etree dom = etree.HTML(html)
2、 查看dom中子元素的個(gè)數(shù) len(dom)
3、 查看某節(jié)點(diǎn)的內(nèi)容:etree.tostring(dom[0])
4、 獲取節(jié)點(diǎn)的標(biāo)簽名稱:dom[0].tag
5、 獲取某節(jié)點(diǎn)的父節(jié)點(diǎn):dom[0].getparent()
6、 獲取某節(jié)點(diǎn)的屬性節(jié)點(diǎn)的內(nèi)容:dom[0].get("屬性名稱")
對(duì)xpath路徑的支持:
XPath即為XML路徑語(yǔ)言,是用一種類似目錄樹的方法來描述在XML文檔中的路徑。比如用"/"來作為上下層級(jí)間的分隔。第一個(gè)"/"表示文檔的根節(jié)點(diǎn)(注意,不是指文檔最外層的tag節(jié)點(diǎn),而是指文檔本身)。比如對(duì)于一個(gè)HTML文件來說,最外層的節(jié)點(diǎn)應(yīng)該是"/html"。
xpath選取元素的方式:
1、 絕對(duì)路徑,如page.xpath("/html/body/p")
,它會(huì)找到body這個(gè)節(jié)點(diǎn)下所有的p標(biāo)簽
2、 相對(duì)路徑,page.xpath("http://p")
,它會(huì)找到整個(gè)html代碼里的所有p標(biāo)簽。
xpath篩選方式:
1、 選取元素時(shí)一個(gè)列表,可通過索引查找[n]
2、 通過屬性值篩選元素p =page.xpath("http://p[@style='font-size:200%']")
3、 如果沒有屬性可以通過text()(獲取元素中文本)、position()(獲取元素位置)、last()等進(jìn)行篩選
獲取屬性值
dom.xpath(.//a/@href)
獲取文本
dom.xpath(".//a/text()")
示例代碼:
#!/usr/bin/python # -*- coding:utf-8 -*- from scrapy.spiders import Spider from lxml import etree from jredu.items import JreduItem class JreduSpider(Spider): name = 'tt' #爬蟲的名字,必須的,唯一的 allowed_domains = ['sohu.com'] start_urls = [ 'http://www.sohu.com' ] def parse(self, response): content = response.body.decode('utf-8') dom = etree.HTML(content) for ul in dom.xpath("http://div[@class='focus-news-box']/div[@class='list16']/ul"): lis = ul.xpath("./li") for li in lis: item = JreduItem() #定義對(duì)象 if ul.index(li) == 0: strong = li.xpath("./a/strong/text()") li.xpath("./a/@href") item['title']= strong[0] item['href'] = li.xpath("./a/@href")[0] else: la = li.xpath("./a[last()]/text()") item['title'] = la[0] item['href'] = li.xpath("./a[last()]/href")[0] yield item
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python使用LSTM實(shí)現(xiàn)銷售額預(yù)測(cè)詳解
大家經(jīng)常會(huì)遇到一些需要預(yù)測(cè)的場(chǎng)景,比如預(yù)測(cè)品牌銷售額,預(yù)測(cè)產(chǎn)品銷量。本文給大家分享一波使用?LSTM?進(jìn)行端到端時(shí)間序列預(yù)測(cè)的完整代碼和詳細(xì)解釋,需要的可以參考一下2022-07-07Python開發(fā)加薪利器之Docker的使用實(shí)踐
docker利用容器技術(shù),獨(dú)立運(yùn)行一個(gè)或者一組應(yīng)用,docker是基于go語(yǔ)言開發(fā),docker鏡像好比是一個(gè)模版,可以通過這個(gè)模版來創(chuàng)建容器服務(wù),今天通過本文給大家分享Docker的使用實(shí)踐,感興趣的朋友跟隨小編一起看看吧2021-05-05python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想
這篇文章主要介紹了python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想,需要的朋友可以參考下2017-12-12Python Collatz序列實(shí)現(xiàn)過程解析
這篇文章主要介紹了Python Collatz序列實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10關(guān)于Python可視化Dash工具之plotly基本圖形示例詳解
這篇文章主要介紹了關(guān)于Python可視化Dash工具之plotly基本圖形示例詳解,需要的朋友可以參考下2021-03-03Python中dtype、type()和astype()的區(qū)別詳解
這篇文章主要介紹了Python中dtype、type()和astype()的區(qū)別詳解,type()是python內(nèi)置的函數(shù),type()返回?cái)?shù)據(jù)結(jié)構(gòu)類型(list、dict、numpy.ndarray 等),需要的朋友可以參考下2023-08-08Python實(shí)現(xiàn)AI自動(dòng)玩俄羅斯方塊游戲
提到《俄羅斯方塊》,那真是幾乎無(wú)人不知無(wú)人不曉。其歷史之悠久,可玩性之持久,能手輕輕一揮,吊打一大波游戲。本文將利用Python實(shí)現(xiàn)俄羅斯方塊進(jìn)階版—AI自動(dòng)玩俄羅斯方塊,感興趣的可以學(xué)習(xí)一下2022-03-03用Python的線程來解決生產(chǎn)者消費(fèi)問題的示例
這篇文章主要介紹了用Python的線程來解決生產(chǎn)者消費(fèi)問題的示例,包括對(duì)使用線程中容易出現(xiàn)的一些問題給出了相關(guān)解答,需要的朋友可以參考下2015-04-04