2013-08-24 55 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 ...或使用陣列版本。 –