2013-08-24 1 views
0

Я ищу страницу для определенных ключевых слов и возвращаемых значений, содержащихся в контейнере класса ds_data. Моя страница имеет несколько соответствий ключевых слов, но я только хочу, чтобы вернуть матчи из определенного контейнера с надписью <div id="tabsBody" class="tabsBody">Beautiful Soup - возможно ли ограничить поиск определенной областью

Есть ли способ сказать Beautiful Soup Я только хочу, чтобы найти там, я попытался

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'}) 

конечно, терпит неудачу, как он пытается вызвать метод 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

просто проверяйте None из каждого метода поиска ... или используйте версии массивов , –