欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲指南之xpath實例解析(附實戰(zhàn))

 更新時間:2022年01月29日 09:12:55   作者:李富貴要上岸985  
在進行網頁抓取的時候,分析定位html節(jié)點是獲取抓取信息的關鍵,目前我用的是lxml模塊,下面這篇文章主要給大家介紹了關于python爬蟲指南之xpath實例解析的相關資料,需要的朋友可以參考下

前言

XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,它最初是用來搜尋XML文檔的,但是它同樣適用于HTML文檔的搜索

XPath的選擇功能十分強大,它提供了非常簡明的路徑選擇表達式,另外,它還提供了超過100個內建函數,用于字符串、數值、時間的匹配以及節(jié)點、序列的處理等,幾乎所有我們想要定位的節(jié)點,都可以用XPath來選擇

xpath解析原理:

1.實現標簽的定位:實例化一個etree的對象,且需要將被解析的頁面源碼數據加載到該對象中。

2.調用etree對象中的xpath方法結合著xpath表達式實現標簽的定位和內容的捕獲。

環(huán)境的安裝

pip install lxml

lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高

如何實例化一個etree對象

1.將本地的html文檔中的源碼數據加載到etree對象中:

etree. parse(filePath)#你的文件路徑

2.可以將從互聯網上獲取的源碼數據加載到該對象中

etree.HtML('page_ text')#page_ text互聯網中響應的數據

xpath 表達式

表達式描述
nodename選取此節(jié)點的所有子節(jié)點
/表示的是從根節(jié)點開始定位。表示的是一個層級。
//表示的是多個層級。可以表示從任意位置開始定位。
.選取當前節(jié)點
選取當前節(jié)點的父節(jié)點
@選取屬性
*通配符,選擇所有元素節(jié)點與元素名
@*選取所有屬性
[@attrib]選取具有給定屬性的所有元素
[@attrib=‘value’]選取給定屬性具有給定值的所有元素
[tag]選取所有具有指定元素的直接子節(jié)點
[tag=‘text’]選取所有具有指定元素并且文本內容是text節(jié)點

對上面表達式的實例詳解

這是一個HTML的文檔

<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>測試bs4</title>
</head>
<body>
	<div>
		<p>百里守約</p>
	</div>
	<div class="song">
		<p>李清照</p>
		<p>王安石</p>
		<p>蘇軾</p>
		<p>柳宗元</p>
		<a  title="趙匡胤" target="_self">
			<span>this is span</span>
		宋朝是最強大的王朝,不是軍隊的強大,而是經濟很強大,國民都很有錢</a>
		<a href="" class="du">總為浮云能蔽日,長安不見使人愁</a>
		<img src="http://www.baidu.com/meinv.jpg" alt="" />
	</div>
	<div class="tang">
		<ul>
			<li><a  title="qing">清明時節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村</a></li>
			<li><a  title="qin">秦時明月漢時關,萬里長征人未還,但使龍城飛將在,不教胡馬度陰山</a></li>
			<li><a  alt="qi">岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節(jié)又逢君</a></li>
			<li><a  class="du">杜甫</a></li>
			<li><a  class="du">杜牧</a></li>
			<li><b>杜小月</b></li>
			<li><i>度蜜月</i></li>
			<li><a  id="feng">鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li>
		</ul>
	</div>
</body>
</html>

從瀏覽器中打開是這樣的

為了方便直觀,我們對寫個HTML文件進行本地讀取進行測試

子節(jié)點和子孫節(jié)點的定位 / 和 //

先來看子節(jié)點和子孫節(jié)點,我們從上往下找div這個節(jié)點,可以看到div的父節(jié)點是body,body父節(jié)點是html

定位到這個HTML的div對象中,看上面html源碼,可以知道有三個div對象

我們通過三種不同的方法來輸出這個節(jié)點的信息,可以看到輸出的是三個一樣的Element,也就是這三種方法實現的功能是一樣的。

import requests
from lxml import etree
tree = etree.parse('test.html')
r1=tree.xpath('/html/body/div')	#直接從上往下挨著找節(jié)點
r2=tree.xpath('/html//div')#跳躍了一個節(jié)點來找到這個div節(jié)點的對象
r3=tree.xpath('//div')##跳躍上面所有節(jié)點來尋找div節(jié)點的對象
r1,r2,r3

>>
([<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>])

屬性定位

如果我只想要div里面song這一個標簽,就可以對其屬性定位

當然返回的還是一個element

r4=tree.xpath('//div[@class="song"]')
r4

>>
>[<Element div at 0x19d447658c8>]

索引定位

如果我只想獲得song里面的蘇軾的這個標簽

我們找到了song,/p可以返回里面的所有標簽,

tree.xpath('//div[@class="song"]/p')
>>
[<Element p at 0x19d4469a648>,
 <Element p at 0x19d4469a4c8>,
 <Element p at 0x19d4469af88>,
 <Element p at 0x19d4469a148>]

這個單獨返回的蘇軾的p標簽,要注意的是這里的索引不是從0開始的,而是1

tree.xpath('//div[@class="song"]/p[3]')
[<Element p at 0x19d4469af88>]

取文本

比如我想取杜牧這個文本內容

和上面一樣,我們要定位到杜牧的這個a標簽,首先要找到他的上一級 li ,這是第五個 li 里面的a所以就有了下面的寫法,text()是把element轉化為文本,當然上面的在后面加個text()都可以展示文本內容。

tree.xpath('//div[@class="tang"]//li[5]/a/text()')

>>
['杜牧']

可以看到這個返回的是一個列表,如果我們想取里面的字符串,可以這樣

tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]

杜牧

看一個更直接的,//li 直接定位到 li這個標簽,//text()直接將這個標簽下的文本提取出來。但要注意,這樣會把所有的li標簽下面的文本提取出來,有時候你并不想要的文本也會提取出來,所以最好還是寫詳細一點,如具體到哪個div里的li。

tree.xpath('//li//text()')

['清明時節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村',
 '秦時明月漢時關,萬里長征人未還,但使龍城飛將在,不教胡馬度陰山',
 '岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節(jié)又逢君',
 '杜甫',
 '杜牧',
 '杜小月',
 '度蜜月',
 '鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘']

取屬性

比如我想取下面這個屬性

可以直接用@取屬性

tree.xpath('//div[@class="song"]/img/@src')

['http://www.baidu.com/meinv.jpg']

或者如果我想取所有的href這個屬性,可以看到tang和song的所有href屬性

tree.xpath('//@href')

['http://www.song.com/',
 '',
 'http://www.baidu.com',
 'http://www.163.com',
 'http://www.126.com',
 'http://www.sina.com',
 'http://www.dudu.com',
 'http://www.haha.com']

爬蟲實戰(zhàn)之58同城房源信息

#導入必要的庫
import requests
from lxml import etree
#URL就是網址,headers看圖一
url='https://sh.58.com/ershoufang/'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.7 Safari/537.36'}
#對網站發(fā)起請求
page_test=requests.get(url=url,headers=headers).text
# 這里是將從互聯網上獲取的源碼數據加載到該對象中
tree=etree.HTML(page_test)
#先看圖二的解釋,這里li有多個,所里返回的li_list是一個列表
li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')
#這里我們打開一個58.txt文件來保存我們的信息
fp=open('58.txt','w',encoding='utf-8')
#li遍歷li_list
for li in li_list:
	#這里 ./是對前面li的繼承,相當于li/div...
    title=li.xpath('./div[2]/h2/a/text()')[0]
    print(title+'\n')
    #把文件寫入文件
    fp.write(title+'\n')
fp.close()

圖一:

圖二:.

這里我們要提取所有的房源信息,可以看到每個小節(jié)點的上一個節(jié)點都是一樣的,我們要提取的是h2節(jié)點a里的房源信息,看圖三

這里每個 /li 節(jié)點里面的子節(jié)點都是一樣的,所以我們可以先找到所有的li節(jié)點,再往下找我們想要的信息

總結

到此這篇關于python爬蟲指南之xpath實例解析的文章就介紹到這了,更多相關python爬蟲之xpath內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python將unicode和str互相轉化的實現

    python將unicode和str互相轉化的實現

    這篇文章主要介紹了python將unicode和str互相轉化的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python免登錄實現域名解析的示例詳解

    Python免登錄實現域名解析的示例詳解

    這篇文章主要介紹了如何利用編寫python腳本,實現通過dnspod api獲取個人域名內的dns解析記錄,從而實現域名的解析、修改和刪除,需要的可以參考一下
    2023-03-03
  • python開發(fā)入門——列表生成式

    python開發(fā)入門——列表生成式

    這篇文章主要介紹了python 列表生成式的相關資料,幫助大家更好的理解和學習python開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • 對Django url的幾種使用方式詳解

    對Django url的幾種使用方式詳解

    今天小編就為大家分享一篇對Django url的幾種使用方式詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • tornado框架blog模塊分析與使用

    tornado框架blog模塊分析與使用

    這篇文章主要介紹了tornado框架blog模塊的使用方法,大家參考使用吧
    2013-11-11
  • python中的try except與R語言中的tryCatch異常解決

    python中的try except與R語言中的tryCatch異常解決

    這篇文章主要為大家介紹了python中的try except與R語言中的tryCatch異常解決的方式及分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Python sqlparse 解析庫的基礎使用過程解析

    Python sqlparse 解析庫的基礎使用過程解析

    sqlparse 是一個 Python 庫,是一個用于 Python 的非驗證 SQL 解析器, 用于解析 SQL 語句并提供一個簡單的 API 來訪問解析后的 SQL 結構,這篇文章主要介紹了Python sqlparse 解析庫的基礎使用,需要的朋友可以參考下
    2024-08-08
  • Python實現簡單2048小游戲

    Python實現簡單2048小游戲

    這篇文章主要為大家詳細介紹了Python實現簡單2048小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 七個非常實用的Python工具包總結

    七個非常實用的Python工具包總結

    Python 擁有海量的包,無論是普通任務還是復雜任務,我們經常在應用程序中使用大量的工具包.本文我將討論一些常被低估的數據科學包,包括:數據清理、應用程序開發(fā)和調試方面,需要的朋友可以參考下
    2021-06-06
  • Python之Class&Object用法詳解

    Python之Class&Object用法詳解

    今天小編就為大家分享一篇Python之Class&Object用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論