Доступ только к некоторым элементам результата BeautifulSoup с отрицательными индексами - PullRequest
3 голосов
/ 07 марта 2012

Я использую BeautifulSoup4 для анализа документа и получаю странное поведение, соответствующий фрагмент кода выглядит следующим образом:

for sale_table in sales_soup.find_all('table'):
    rows = sale_table.find_all('tr')
    grantor = rows[3]

Однако это дает мне исключение индекса вне диапазона. Поэтому я выполнил некоторые базовые проверки и len (rows) == 4 непосредственно до и после назначения лица, предоставляющего право (используя индекс, который не выдает исключение). Также я могу получить доступ к первому и второму элементам строк с row [0] и row [1]. Однако я могу получить доступ только к элементам 3 и 4 со строками [-1] и строками [-2], пытаясь использовать индексы, 2 или 3, или -3, или -4 выбрасывают индекс вне диапазона исключений. Кроме того, когда я отправляю file.write (str (rows)) и получаемый HTML, он точно соответствует HTML тестового документа.

Подводя итог, я могу получить доступ ко всему списку, но я бы хотел понять, почему я получаю это странное исключение.

Извините, ребята, ответ в том, что я идиот. В разметке существует несогласованная таблица, которая короче и вызывает исключение. Запуск цикла по одному показывает, что len! = 4 на каждой итерации, извините за дезинформацию. Это плохая форма, чтобы отредактировать этот вопрос, так как он неправильный?

1 Ответ

0 голосов
/ 21 августа 2012

Вы никогда не должны индексировать список неизвестного размера.Никогда не верьте, что разметка всегда будет правильной.

По моему опыту работы с BeautifulSoup, вы должны написать множество операторов if, чтобы покрыть себя.Измените приведенный выше код на что-то вроде этого:

for sale_table in sales_soup.find_all('table'):
  rows = sale_table.find_all('tr')
  if len(rows) > 3:
    grantor = rows[3]
  else:
    grantor = None

Кроме того, посмотрите в документации BS4 , чтобы узнать больше опций для .find_all(), которые могут быть полезны для вашего варианта использования.Например, если вы получаете только 4-й элемент, используйте limit=4 в качестве аргумента ключевого слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...