2015-02-07 174 views
1

我想用BeautifulSoup解析一個糟糕的HTML頁面來檢索一些信息。代碼如下:如何通過路徑訪問元素?

import bs4 

with open("smartradio.html") as f: 
    html = f.read() 

soup = bs4.BeautifulSoup(html) 
x = soup.find_all("div", class_="ue-alarm-status", playerid="43733") 
print(x) 

提取片段,我想進一步分析:

[<div alarmid="f319e1fb" class="ue-alarm-status" playerid="43733"> 
<div> 
<div class="ue-alarm-edit ue-link">Réveil 1:   </div> 
<div>allumé</div> 
<div>7:00</div> 
</div> 
<div> 
<div class="ue-alarm-dow">Lu, Ma, Me, Je, Ve   </div> 
<div class="ue-alarm-delete ue-link">Supprimer</div> 
</div> 
</div>, <div alarmid="ea510709" class="ue-alarm-status" playerid="43733"> 
<div> 
<div class="ue-alarm-edit ue-link">Réveil 2:   </div> 
<div>allumé</div> 
<div>7:30</div> 
</div> 
<div> 
<div class="ue-alarm-dow">Sa   </div> 
<div class="ue-alarm-delete ue-link">Supprimer</div> 
</div> 
</div>] 

我對檢索:

  • 小時(5線和14)
  • 字符串(法語天數)<div class="ue-alarm-dow">

我相信在這幾天裏重複一個find()find_all()就足夠了。我提的是,因爲雖然它抓住正確的信息,我不知道這是解析與BeautifulSoup文件以正確的方式(但至少它的工作原理):

for y in x: 
    z = y.find("div", class_="ue-alarm-dow") 
    print(z.text) 
# output: 
# Lu, Ma, Me, Je, Ve    
# Sa  

我不知道怎麼弄儘管如此。有沒有辦法通過路徑導航樹(從我知道小時在第二個<div>,3個<div>深處)?或者我應該以不同的方式做?

回答

1

您也可以依靠allumé文本,並得到the next sibling div element

y.find('div', text=u'allumé').find_next_sibling('div').text 

,或者以類似的方式,依靠以前divclass

y.find('div', class_='ue-alarm-edit').find_next_siblings('div')[1].text 

,或者使用regular expressions

y.find('div', text=re.compile(r'\d+:\d+')).text 

或者,通過索引獲取div

y.find_all('div')[4].text