2013-08-24 61 views
0

我正在搜索特定关键字的页面并返回类别为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 
+0

html在哪里? – falsetru

+0

HTML很大,不适合,试图尽可能地缩短一切。 – Ninja2k

+0

如果没有看到html代码块和预期结果,就不可能真正回答这个问题 –

回答

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,所以如果您不确定内容的确如此,您需要检查返回值。

+0

工作得很好,同时也大大减少了我的代码执行时间:) – Ninja2k

+1

只需检查每个find方法中的None ...或使用阵列版本。 –