Python和Beautifulsoup:findA的奇怪行为

2024-10-02 22:36:53 发布

您现在位置:Python中文网/ 问答频道 /正文

soup        = BeautifulSoup(html)
boxes       = soup.findAll("div", { "class" : re.compile(r'\bmixDesc\b') })

我想我只有“mixtesc”类的盒子。在

所以我正在调试以确定

^{pr2}$

我在解析的html文件中只有10个div带有mixDesc

但我有30个盒子,很多(30个里有20个)都印成

[]

你能解释一下为什么会这样吗?为什么芬德尔要抓这个空标签? 或者。。。我还犯了什么错误?在

编辑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,因为是嵌套的,但为什么它们是空的?如何过滤掉这些?在


Tags: orgdivboxidhttpimgdatanotice
1条回答
网友
1楼 · 发布于 2024-10-02 22:36:53

问题是,默认情况下findAll()执行递归搜索,并且由于有嵌套的div containsbmixDesc类,所以您得到了这些结果。在

recursive=False传递给findAll,并使用id=videosIndexList在父div中搜索div。在

而且,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个框)。在

相关问题 更多 >