當前位置:
首頁 >
python中lxml模块的使用
發布時間:2024/4/11
28
豆豆
生活随笔
收集整理的這篇文章主要介紹了
python中lxml模块的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
1.lxml的安裝
pip install lxml2.導入lxml 的 etree 庫
from lxml import etree3.利用etree.HTML,將字符串轉化為Element對象,Element對象具有xpath的方法,返回結果的列表,能夠接受bytes類型的數據和str類型的數據。
from lxml import etree html = etree.HTML(response.text) ret_list = html.xpath("xpath字符串")也可以這樣使用:
from lxml import etree htmlDiv = etree.HTML(response.content.decode()) hrefs = htmlDiv.xpath("//h4//a/@href")4.把轉化后的element對象轉化為字符串,返回bytes類型,etree.tostring(element)
假設我們現有如下的html字符換,嘗試對他進行操作:
<div> <ul> <li class="item-1"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此處缺少一個 </li> 閉合標簽 </ul> </div>代碼示例:
from lxml import etree text = ''' <div> <ul> <li class="item-1"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </ul> </div> '''html = etree.HTML(text) print(type(html)) handeled_html_str = etree.tostring(html).decode() print(handeled_html_str)輸出結果:
<class 'lxml.etree._Element'> <html><body><div> <ul> <li class="item-1"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </li></ul> </div> </body></html>可以發現,lxml確實能夠把確實的標簽補充完成,但是請注意lxml是人寫的,很多時候由于網頁不夠規范,或者是lxml的bug。
即使參考url地址對應的響應去提取數據,任然獲取不到,這個時候我們需要使用etree.tostring的方法,觀察etree到底把html轉化成了什么樣子,即根據轉化后的html字符串去進行數據的提取。
5.lxml的深入練習
from lxml import etree text = ''' <div> <ul> <li class="item-1"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </ul> </div> '''html = etree.HTML(text)#獲取href的列表和title的列表 href_list = html.xpath("//li[@class='item-1']/a/@href") title_list = html.xpath("//li[@class='item-1']/a/text()")#組裝成字典 for href in href_list:item = {}item["href"] = hrefitem["title"] = title_list[href_list.index(href)]print(item)輸出為:
{'href': 'link1.html', 'title': 'first item'} {'href': 'link2.html', 'title': 'second item'} {'href': 'link4.html', 'title': 'fourth item'}6.lxml模塊的進階使用
返回的是element對象,可以繼續使用xpath方法,對此我們可以在后面的數據提取過程中:先根據某個標簽進行分組,分組之后再示例如下:
from lxml import etree text = ''' <div> <ul> <li class="item-1"><a>first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </ul> </div> '''html = etree.HTML(text)li_list = html.xpath("//li[@class='item-1']") print(li_list)結果為:
[<Element li at 0x11106cb48>, <Element li at 0x11106cb88>, <Element li at 0x11106cbc8>]數據的提取可以發現結果是一個element對象,這個對象能夠繼續使用xpath方法
先根據li標簽進行分組,之后再進行數據的提取
結果是:
{'href': None, 'title': 'first item'} {'href': 'link2.html', 'title': 'second item'} {'href': 'link4.html', 'title': 'fourth item'}7.案列:貼吧極速版:
代碼如下:
總結
以上是生活随笔為你收集整理的python中lxml模块的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬取糗事百科
- 下一篇: python random模块的使用