xpath的 text()和string() 區別


原文:https://www.cnblogs.com/CYHISTW/p/12312570.html

 

Xpath的text()與string(.)

我們在爬取網站使用Xpath提取數據的時候,最常使用的就是Xpath的text()方法,該方法可以提取當前元素的信息,但是某些元素下包含很多嵌套元素,

我們想一並的提取出來,這時候就用到了string(.)方法,但是該方法使用的時候跟text()不太一樣,下面就舉實例來講解一下具體的區別。


 

實例網站:https://www.biedoul.com/wenzi/1/  

例如

以這個段子為例,如果我們使用text()來拿取這個,會發現這一個段子竟然有11個text()信息,那么我們直接用text()來拿會怎么樣呢?我們來看下結果

 

 發現我們確實拿到了,可是我們卻是拿到一個列表中的多個字符串,我們想合成一個還需要拼接,所以我們可以使用 string(.),來看看效果

發現現在就是我們想要的結果了,因此當我們需要拿取嵌套節點的內容時候,使用string(.)方法效果更好

 附上代碼:

復制代碼
import requests
from lxml import etree
url='https://www.biedoul.com/wenzi/1/'
headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
response = requests.get(url,headers=headers)
htmlweb=etree.HTML(response.text)
#注意xpath直接拿到的是一個列表,想要使用string(.)方法要在之前的對象加上[0]
#string(.)方法不能直接與之前的xpath寫到一起,需要在之前的對象的基礎上使用
item=htmlweb.xpath("//dl[@id='xh_180839']/dd")[0].xpath("string(.)")
print(item)
復制代碼

 

既然寫到這里了就直接附上爬取整個網站的代碼吧,網站比較簡單,沒事用來看看段子也還湊合

復制代碼
import requests
from lxml import etree
urllist=[]
#構造1000頁的url
for i in range(1,1001):
    urllist.append('https://www.biedoul.com/wenzi/'+str(i)+'/')

headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
number=0
for url in urllist:
    print('當前網站為'+str(url))
    response=requests.get(url=url,headers=headers)
    #使用xpath時候需要先用lxml轉換一下內容
    htmlweb=etree.HTML(response.content.decode())
    items=htmlweb.xpath("//dl[@class='xhlist']")
    #注意xpath拼接寫法  要加上"."
    for item in items:
        print('*************************段子編號'+str(number)+'**************************************')
        print('title:'+item.xpath(".//dd/a/strong/text()")[0])
        #string(.)方法切記如何使用 可以獲取節點下所有嵌套節點內容
        print('content:'+item.xpath("./dd")[0].xpath("string(.)"))
        number+=1
    print('\n')
復制代碼

 

效果如圖

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM