xpath 第一个元素_XPath
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言,但它同樣適用于HTML的文檔搜索。
在爬蟲中我們使用xpath提取特定位置的文本內容
相關鏈接:
XPath用法:http://www.w3school.com.cn/xpath/index.asp
目錄1、XPath語法 2、準備工作
3、功能示范 4、屬性獲取
5、屬性匹配 6、例子示范
1、XPath語法
用法及結果:
2、準備工作
xpath在python中是lxml庫中的一個功能,所以首先要確保安裝好lxml庫,若沒有安裝可以參考前面的文章——爬蟲開發環境部署(一)
3、例子示范
我們要從這段html中提取出XPath
from lxml import html html_text = ''' <html> <head></head> <body> <div class="name"> <span class="title">XPath</span> </div> <div class="name"> <span class="text">爬蟲</span> </div> </body> </html> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div/span[1]/text()') print(result)方法二,把div的class屬性加上(這種方式在實際應用中經常用到)
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[1]/text()') print(result)運行結果:
['XPath', '爬蟲']調用HTML類進行初始化,這樣就成功構造了一個XPath解析對象,也可以自動修正HTML文本,變成符合規則的文本。如果我們要提取文本的話需要在xpath規則后加/text()。
我們發現結果是列表['XPath', '爬蟲'],里面有兩個字符串,但是我們只想要XPath那我們要怎么做呢?發現XPath的span標簽的class屬性是title,而爬蟲的class屬性是text,我們只需要在把span標簽的屬性在明確一下就可以了
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[@class="title"]/text()') print(result)運行結果:
['爬蟲']4、屬性獲取
屬性獲取可以獲取html標簽里的屬性值,多用在獲取網頁鏈接上
例如我要獲取百度一下的網站地址:
from lxml import htmlhtml_text = ''' <html> <head></head> <body> <div class="name"> <a href="https://www.baidu.com">百度一下</span> </div> </body> </html> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/a/@href') print(result)運行結果:
['https://www.baidu.com']5、屬性匹配
屬性匹配包含屬性多值匹配和多屬性匹配
- 5.1、屬性多值匹配
例如我們要獲取span標簽的XPath:
from lxml import htmlhtml_text = ''' <div class="name"> <span class="title text">XPath</span> </div> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[@class="title"]/text()') print(result)運行結果:
[]居然是空列表為什么呢?
我們可以看到span標簽的class屬性中有兩個屬性值,這時就要用到contains()函數了,代碼如下:
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[contains(@class, "title")]/text()') print(result)運行結果:
['XPath']
- 5.2、多屬性匹配
有些標簽有多個屬性,這時需要同時匹配多個屬性,這時要用到運算符and來連接,
例:
from運行結果:
['XPath']
6、例子示范
接下來實戰一波
目標網站:https://gz.fang.lianjia.com/loupan
我們要獲取這些小區的名字
在網頁中點右鍵選擇檢查,我們會看到界面的右側出現了一堆看不懂的英文(其實這些就是網頁的源碼),點擊我標記紅框內的按鈕,這個按鈕是查找網頁元素的,點完后移到小區名上點擊一下就可以看到相關的源碼
我們可以很快的在源碼中找到我們所需要的金茂灣這幾個字,它是在一個a標簽中,在往上看發現這是一個在div標簽內的第一個a標簽的文本,這個div標簽的屬性是class="resblock-name",那xpath的規則就是:'//div[@class="resblock-name"]/a/text()'
同樣的原理我們查找越秀東坡,可以發現xpath規則和金茂灣的是一樣的,我們就可以推斷出這個網站的小區名應該都是這樣的,當然要獲取數據還需要配合requests庫,先請求獲取網頁的源碼
代碼如下:
from lxml import html import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36' }url = 'https://gz.fang.lianjia.com/loupan' reponse = requests.get(url, headers=headers) name_regex = '//div[@class="resblock-name"]/a/text()' etree = html.etree a = etree.HTML(reponse.text) result = a.xpath(name_regex) print(result)運行結果:
['金茂灣', '越秀東坡', '景業東湖洲豪園', '振業天頌花園', '珠光山水誠品', '天健匯', '保利花海灣', '保利半島', '時代幸匯', '綠地柏玥晶舍']
請求的時候一定要加入headers,不然會比封掉
headers也很好拿到
序號2隨便選都可以,然后把序號4的內容加入headers就好了
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的xpath 第一个元素_XPath的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 能量时域空间物理_5G新在哪儿(11)-
- 下一篇: python 多数据输出到txt_详解p