美丽的汤 - 是否可以限制搜索到某个区域

时间:2013-08-24 10:23:45

标签: python beautifulsoup

我正在搜索某个关键字的页面,并返回类ds_data容器中包含的值。我的页面有多个关键字匹配,但我只想从标有<div id="tabsBody" class="tabsBody">

的某个容器返回匹配项

有没有办法告诉美丽的汤我只想从那里搜索,我试过

ds_data = soup.find('div', {'class': 'tabsBody'}.findNext(text=pattern).findNext('div', {'class': 'ds_data'})

但失败

我的代码

keyword_list = [

'USB 2.0 ports quantity',
'USB 3.0 ports quantity',
'VGA',
'Internal memory'

]


#Iterate through our keyword list and return the results
for search_text in keyword_list:
    pattern = re.compile(r'\s*%s\s*' % search_text)
    ds_data = soup.find(text=pattern).findNext('div', {'class': 'ds_data'})
    if ds_data.find('img', {'class': 'spacer_top n-sign'}):
        result_text = '0'
    elif ds_data.find('img', {'class': 'spacer_top y-sign'}):
        result_text = 'Yes'
    else:
        result_text = ds_data.text
    print search_text, result_text

1 个答案:

答案 0 :(得分:2)

您的代码(逐字复制并附带问题的语法错误

ds_data = soup.find('div', {'class': 'tabsBody'}
       .findNext(text=pattern)
       .findNext('div', {'class': 'ds_data'})

肯定会失败,因为它试图在python字典上调用方法findNext; dict()对象没有这样的方法。

但确实soup.find会返回一个你可以搜索的新汤,因此:

divsoup = soup.find('div', {'class': 'tabsBody'})
ds_data = divsoup.find(text=pattern).findNext('div', {'class': 'ds_data'})

仅在<div class="tabsBody"></div>元素内返回匹配项。请注意,findNext会将树导航为兄弟姐妹,因此find只会导航到子节点。

这些方法中任何一个名称都是单数(不包含所有)的方法在匹配时返回None,所以如果你不确定内容,你确实需要检查返回值。