2013-10-27 3 views
1

Я использую BeautifulSoup сделать следующее:
section = soup.findAll('tbody')[0]BeautifulSoup список исключений из диапазона

Как установить переменную так, используя первый элемент списка ... без него бросать исключение: IndexError: list index out of range если BS4 не может найти человека?

Любые идеи?

+0

'section = soup.find ('tbody')'. '' '' '' '' '' 'tbody' не существует. – falsetru

ответ

3

Вы можете вернуть ответ от findAll и Чека это длина первым:

x = soup.findAll("tbody") 

if x is not None and len(x) > 0: 
    section = x[0] 
+1

Поскольку 'find_all' возвращает пустой список, проверки' None' и length являются избыточными ... ', если x:' достаточно - (возможно, даже однострочный в 'section = x [0], если x else 'Empty' ' –

+0

Спасибо! Я должен был проверить, существует ли этот элемент, в противном случае индекс был вне диапазона при доступе к 0-му элементу –

2

doc говорит

Поскольку find_all() является наиболее популярным методом в Прекрасном поиске Soup API, вы может использовать ярлык для него. Если вы рассматриваете объект BeautifulSoup или объект Tag как функцию, то это то же самое, что и вызов find_all() на этом объекте.

так что в вашем случае я думаю, что вы можете просто сделать:

if soup("tbody"): 
    section = soup("tbody")[0] 

Обратите внимание, что в вашем коде, когда происходит ошибка section является пустым списком, но вы пытаетесь получить элемент [0], который еще не существует. В приведенном выше коде вы сначала проверяете, существует ли список и не пуст. Если проверка прошла, вы можете получить доступ к первому элементу списка.

2

Каждый, кто разбирает HTML, будет подвергать этому типу вопрос. Элемент, который вы ищете, находится во вложенной структуре ... table -> tbody -> tr -> td ... и т. Д.

Однако вам нужно иметь в виду несколько вещей:

(1) Чем детальнее указать путь для поиска элемента. Чем проще ваш код сломается, если вы не будете корректно обрабатывать исключения и фактически, то логика, которую вы найдете, может быть вообще не общей.

(2) Попробуйте найти элементы по уникальному идентификатору или классам вместо рассчитывая на порядок некоторых общих тегов.

(3) Если текст, который вы пытаетесь собрать, следует шаблону. вы можете легко найти его с помощью самого текста, который более прост для программиста ... Тексты - это то, что люди видят на самом деле.

import re 
... 
print soup.find_all(text=re.compile("pattern")) 
# then you can find the element by calling parent of the found texts. 

В короткий путь, никогда не следует искать в «TBODY» тега в моей точки зрения ... потому что код во все дни нравится:

<table..> 
    <tbody> 
     <tr> 
     ... 
    </tbody> 
<table> 

Если вы нашли таблицу уже, вы можете просто сделать

table = soup.find('table'...) 
# unless you are trying to not recursively find tr, then you have to find tobody first and find_all(recursive=FALSE) 
table.find_all('tr') 
Смежные вопросы