2014-03-27 94 views
0
soup  = BeautifulSoup(html) 
boxes  = soup.findAll("div", { "class" : re.compile(r'\bmixDesc\b') }) 

我認爲我只有類'mixDesc'的箱子。Python和Beautifulsoup:奇怪的行爲findAll

所以我調試,以確保

count = 0 
for box in boxes : 
    count = count + 1 

    print "JWORG box {0}".format(count) 
    print "JWORG box len {0}".format(len(box)) 
    print box 

我只有10 mixDesc類的div中解析HTML文件

但我得到了30盒和大量(20的30 )被打印爲

[] 

你能解釋爲什麼會發生這種情況嗎?爲什麼findAll抓住這個空標籤? 或...我還有什麼錯誤?

編輯1:

我用這個來編程XBMC插件,所以我使用的唯一可用的版本,我

編輯2:

我不能複製/粘貼所有的HTML,但我刮這個頁面:http://www.jw.org/it/video/?start=70

所以你可以看到HTML源,以幫助我。

編輯3: 這是我的XBMC日誌,請沒有我印連計數器和len(盒)

20:27:54 T:5356 NOTICE: JWORG box 1 
20:27:54 T:5356 NOTICE: JWORG box len 5 
20:27:54 T:5356 NOTICE: [<div class="syn-img sqr mixDesc"> 
              <a href="/it/cosa-dice-la-Bibbia/famiglia/bambini/diventa-amico-di-geova/cantici/120-felice-chi-mette-in-pratica-ci%C3%B2-che-ode/" class="jsDownload jsVideoModal jsCoverDoc" data-jsonurl="/apps/TRGCHlZRQVNYVrXF?output=json&amp;pub=pksn&amp;fileformat=mp4&amp;alllangs=1&amp;track=120&amp;langwritten=I&amp;txtCMSLang=I" data-coverurl="/it/cosa-dice-la-Bibbia/famiglia/bambini/diventa-amico-di-geova/cantici/120-felice-chi-mette-in-pratica-ci%C3%B2-che-ode/" data-onpagetitle="Cantico 120: Felice chi mette in pratica ciò che ode" title="Play o download | Cantico 120: Felice chi mette in pratica ciò che ode" data-mid="1102013357"> 
              <span class="jsRespImg" data-img-type="sqr" data-img-size-lg="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357.art/1102013357_univ_sqr_lg.jpg" data-img-size-md="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357.art/1102013357_univ_sqr_md.jpg" data-img-size-sm="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357.art/1102013357_univ_sqr_sm.jpg" data-img-size-xs="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357.art/1102013357_univ_sqr_xs.jpg"></span></a><noscript><img src="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357_I/1102013357_univ_sqr_xs.jpg" alt="" /></noscript> 

              <div style="display:none;" class="jsVideoPoster mid1102013357" data-src="http://assets.jw.org/assets/m/ijw13pk/1102013357/ijw13pk_id-1102013357.art/1102013357_univ_lsr_lg.jpg" data-alt=""></div> 
              </div>] 
20:27:54 T:5356 NOTICE: JWORG box 2 
20:27:54 T:5356 NOTICE: JWORG box len 7 
20:27:54 T:5356 NOTICE: [] 
20:27:54 T:5356 NOTICE: JWORG box 3 
20:27:54 T:5356 NOTICE: JWORG box len 7 
20:27:54 T:5356 NOTICE: [] 

編輯4:

行,有30個div的,因爲the're嵌套,但爲什麼他們是空的?以及如何過濾掉這些?

+1

什麼是您的HTML? –

+0

至少,你最好使用'BeautifulSoup4'和'find_all()'。 – alecxe

+0

我正在使用python在XBMC上編寫插件。我無法複製/粘貼所有的html,但我在抓這個頁面:http://www.jw.org/it/video/?start=70 – realtebo

回答

2

問題是,默認情況下,findAll()執行遞歸搜索,因爲嵌套div包含bmixDesc類 - 您正在獲得這些結果。

通過recursive=FalsefindAll並在父div中搜索div與id=videosIndexList

而且,還有,BeautifulSoup3不再維護 - 切換到BeautifulSoup4並使用find_all()

下面的代碼應該是什麼樣子(使用BeautifulSoup4):

import re 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 


soup = BeautifulSoup(urlopen('http://www.jw.org/it/video/?start=70')) 

div = soup.find('div', {'id': 'videosIndexList'}) 
boxes = div.find_all("div", { "class" : re.compile(r'\bmixDesc\b')}, recursive=False) 

for box in boxes: 
    print box.text 

這將讓你只有頂層的div(10盒)。

+0

時我也會發生這個錯誤,但是爲什麼嵌套div打印爲空...? – realtebo

+0

'soup.findAll(「div」,{「class」:re.compile(r'\ bmixDesc \ b')},recursive = False)'給我零結果。另外,我沒有選擇bs版本,我只有xbmc環境下的v3 – realtebo

+0

@realtebo nope,你應該用'videosIndexList' id(請參閱我的示例)在'div'上調用'findAll'。 – alecxe