日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

利用python爬虫(part6)--用Xpath匹配带来的数据合并问题

發布時間:2023/12/19 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用python爬虫(part6)--用Xpath匹配带来的数据合并问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記
如果在本Blog里看到拼音,那可能是由于第一次shen he沒通過被逼的,葛優躺,不知所措。


用Xpath匹配帶來的數據合并問題

在我以往的爬蟲案例中(比如:X凰X聞案例),我用Xpath分別得到了Xin聞名稱列表name_list和Xin聞詳情鏈接列表link_list,并用zip()函數,形成一個生成器對象,將兩個列表’合在一起’。

部分代碼如下(html源代碼就不貼在這里了,太占位置了):

parse_html = etree.HTML(html) link_xpath = \ '//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/@href' name_xpath = \ '//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/text()'link_list = parse_html.xpath(link_xpath) link_list = ['http:{}'.format(i) for i in link_list] name_list = parse_html.xpath(name_xpath) #只要使用xpath方法進行數據爬取,結果就會返回一個列表 data_zip = zip(name_list, link_list) for item in data_zip:print(item)

這種方法看起來很方便,但是利用內置生成器函數zip(),會產生一些嚴重的問題,進而導致后續的數據分析錯誤。

  • 舉個例子

有如下HTML代碼:

<ol><li class="Ra01"><name class = 'Bunny01'>小黃</name><age>8</age><food>胡蘿卜</food></li><li class="Ra01"><name class = 'Bunny02'>大白</name><age></age><food>白菜</food></li><li class="Ra02"><name class = 'Bunny03'>奧尼爾</name><age>20</age><food>提草</food></li><li class="Ra03"><name class = 'Bunny03'>王子</name><age>30</age><food>進口提草</food></li></ol>

可以看到這個HTML頁面中有4對name和age數據,但是由于某些不明原因,導致某些age節點中的數據丟失。

如果此時,我們要獲取HTML頁面中name節點和age節點中的文本中,則它們的Xpath可以寫成:

#name節點內文本 //ol/li/name/text() #age節點內文本 //ol/li/age/text()

此時我們編寫python代碼:

# -*- coding: utf-8 -*-from lxml import etreehtml = \ """<ol><li class="Ra01"><name class = 'Bunny01'>小黃</name><age>8</age><food>胡蘿卜</food></li><li class="Ra01"><name class = 'Bunny02'>大白</name><age></age><food>白菜</food></li><li class="Ra02"><name class = 'Bunny03'>奧尼爾</name><age>20</age><food>提草</food></li><li class="Ra03"><name class = 'Bunny03'>王子</name><age>30</age><food>進口提草</food></li></ol> """parse_html = etree.HTML(html)#獲取所有name節點內文本 name_list = parse_html.xpath('//ol/li/name/text()') print(name_list) print('-'*20)#獲取所有age節點內文本 age_list = parse_html.xpath('//ol/li/age/text()') print(age_list)

控制臺輸出:

['小黃', '大白', '奧尼爾', '王子'] -------------------- ['8', '20', '30']

我們看到,由于HTML源代碼中某些age節點內的數據丟失,導致name_list和age_list的長度不一致,所以此時如果我們用內置生成器zip(),不僅會導致數據丟失,而且會導致name和age不匹配,這么說可能不夠形象,我們zip()一下,試試:

for item in zip(name_list, age_list):print(item)

控制臺輸出:

('小黃', '8') ('大白', '20') ('奧尼爾', '30')

我們看到,結果只輸出了3條數據,且從’大白開始,各個name和age不匹配。

根據HTML源代碼,我們得到的數據應該是這樣的:

('小黃', '8') ('大白', '') ('奧尼爾', '20') ('王子', '30')

所以,我們要換一種思維,用另一種方法,將數據’拼接’在一起。

比如:先獲取每一個li節點對象,將這些對象裝在一個列表中,再遍歷這個列表中的li節點對象,并分別對各個li節點對象獲取name和age文本數據,并將它們拼接在一起。同樣,我們用代碼演示一遍:

parse_html = etree.HTML(html)#獲取所有li節點(大節點)對象 li_list = parse_html.xpath('//ol/li') #print(name_list) #print('-'*20)data_list = [] #遍歷li節點對象列表 for item in li_list:name = item.xpath('./name/text()')age = item.xpath('./age/text()')if not name:name = 'None'if not age:age = '0'data_list.append((name[0], age[0]))for item in data_list:print(item)

注意,我們看到上面Xpath代碼./name/text()中,最開頭有一個.點,這個點有當前路徑的意思,換句話說,這個點代表了li節點所在的位置。

控制臺輸出:

('小黃', '8') ('大白', '0') ('奧尼爾', '20') ('王子', '30')

可喜可賀!得到的name和age數據一個不少,且沒有出現name和age匹配錯誤的現象。

總結

以上是生活随笔為你收集整理的利用python爬虫(part6)--用Xpath匹配带来的数据合并问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。