原文: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')
效果如圖