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)過(guò)了utf-8解碼,即code =html.decode('utf-8', 'ignore'),否則會(huì)出現(xiàn)解析出錯(cuò)情況。因?yàn)橹形谋痪幋a成utf-8之后變成 '/u2541' 之類(lèi)的形式,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)簽名稱(chēng):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("屬性名稱(chēng)")
對(duì)xpath路徑的支持:
XPath即為XML路徑語(yǔ)言,是用一種類(lèi)似目錄樹(shù)的方法來(lái)描述在XML文檔中的路徑。比如用"/"來(lái)作為上下層級(jí)間的分隔。第一個(gè)"/"表示文檔的根節(jié)點(diǎn)(注意,不是指文檔最外層的tag節(jié)點(diǎn),而是指文檔本身)。比如對(duì)于一個(gè)HTML文件來(lái)說(shuō),最外層的節(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è)列表,可通過(guò)索引查找[n]
2、 通過(guò)屬性值篩選元素p =page.xpath("http://p[@style='font-size:200%']")
3、 如果沒(méi)有屬性可以通過(guò)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' #爬蟲(chóng)的名字,必須的,唯一的
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)容可查看本站專(zhuān)題:《Python Socket編程技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Django自定義插件實(shí)現(xiàn)網(wǎng)站登錄驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Django自定義插件實(shí)現(xiàn)網(wǎng)站登錄驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法
這篇文章主要介紹了解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
詳解python while 函數(shù)及while和for的區(qū)別
這篇文章主要介紹了python while 函數(shù)及while和for的區(qū)別 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
如何利用Python連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存
當(dāng)我們學(xué)習(xí)了mysql數(shù)據(jù)庫(kù)后,我們會(huì)想著該如何將python和mysql結(jié)合起來(lái)運(yùn)用,下面這篇文章主要給大家介紹了關(guān)于如何利用Python連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存的相關(guān)資料,需要的朋友可以參考下2021-11-11
Python光學(xué)仿真學(xué)習(xí)Gauss高斯光束在空間中的分布
這篇文章主要介紹了Python光學(xué)仿真學(xué)習(xí)中Gauss高斯光束在空間中的分布理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10
詳解python pandas 分組統(tǒng)計(jì)的方法
這篇文章主要介紹了詳解pandas python 分組統(tǒng)計(jì)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10

