2015-09-28 4 views
-1

ЦельЗачем Python ломаться на полпути через петлю? TypeError: __getitem__

У меня есть каталог с 65 .txt файлов, которые я разборе, один за другим, и сохранение результатов в 65 соответствующих .txt файлов. Затем я планирую их конкатенировать, но я не уверен, что прямое переключение на это может помочь найти решение здесь.

Проблема

Я получаю:

TypeError: 'NoneType' object has no attribute 'getitem'

и видел два подобных темы:

TypeError: 'NoneType' object has no attribute '__getitem__'

Python: TypeError: 'NoneType' object has no attribute '__getitem__'

Моя проблема кажется несколько странной, поскольку действительно управляет, чтобы просматривать входные файлы, разбирать их и записывать выходной файл примерно десять раз, после чего я получаю сообщение об ошибке. Все файлы похожи, только исходный HTML-код с веб-сайта (т. Е. Тот же веб-сайт, только разные страницы его и так же базовая структура HTML).

Вот функция, в которой происходит ошибка; в последней строке этого фрагмента кода:

def parse(elTree): 
    desired_value = elTree.xpath('my_very_long_xpath') 
    desired_value = [x.get('title')[8:] for x in desired_value] 

У меня есть еще несколько вариантов этих - я на самом деле разбор около 5 до 6 различных desired_value с. И все это просто выполняется внутри большего цикла, где файлы считываются в функцию parse, а затем вывод записывается в новый файл.

То, что я пытался

Я удалил файл, в котором я сначала получил ошибку, но произошла та же ошибка в следующем файле. Я сделал то же самое, удалив два файла, но все же получаю эту ошибку.

Я представил time.sleep(3) между каждым файлом, чтобы позволить вещам, возможно, работать более плавно. Я понял, что может быть буфер для всего процесса, который, возможно, читается, и его просто стирают, и поэтому там нет файла ... Вот аналогичный occurrence в цикле в C. К сожалению, сон в течение 3 секунд (плюс тогда разбросанный по различным точкам) мне не помог. код не работает точно в той же точке.

Согласно the documentation, a TypeError возникает, когда функция применяется к объекту несоответствующего типа, так как может случиться, что он возникает после правильной работы 10 или 11 раз? Вот более официальная information относительно __getitem__ метода

Поскольку код делает хорошо работать иначе, я не включал остальное, но если кто-то подозревает, что может происходить где-то еще, по уважительной причине, то я добавлю еще кода.

Я проверял содержимое файлов .txt для тех, кто работал, и тех, где он был неудачен, и xpaths работают в обоих, содержимое - это, которые необходимо найти и проанализировать.

Я использовал код в 30 копиях того же файла, который успешно выполнился, поэтому в HTML-коде должны быть тонкие отличия, которые мой парсер не распознает.

+2

'x.get («название») 'возвращает' None' –

+0

Да, это, кажется, стандартный ответ, как видно из трех приведенных мной ссылок. Вопросы: ** почему **, когда он уже успел пройти через 10 или около 65 файлов? Кажется, он не зависит от фактического файла, как я также упомянул в своем OP. –

+1

Чтобы расширить то, что говорит @PeterWood, метод 'get' ищет атрибут' title', а входные данные могут его не иметь. Это не проблема python - вам нужно выяснить, все ли ваши данные выглядят так, как вы ожидаете, и соответствующим образом обновить свой код. –

ответ

0

TypeError: 'NoneType' object has no attribute '__getitem__' означает, что вы пытались использовать какой-то индекс, например mylist[2], на None вместо того, чтобы что-то вроде list. Это означает, что внутренний вызов этого объекта __getitem__ не удался, потому что None, являющийся объектом типа Nonetype, не имеет такого метода, определенного для него.

Проблема заключается в x.get('title')[8:]: метод get() не нашел ключ под названием 'title' в x, поэтому он вернулся None. Тем не менее, вы затем попробуйте обрезать его [8:]. Если он вернул list или аналогичный объект, он будет работать нормально, но не так с None.

Я рекомендую ввести какие обработки ошибок:

try: 
    desired_value = [x.get('title')[8:] for x in desired_value] 
except TypeError: 
    return 

Вам придется корректировать и расширять эту заглушку, чтобы заставить его вести себя таким образом, который подходит для вашей программы. Возможно, вместо заявления return вам нужно определить какой-то по умолчанию desired_value или что-то в этом роде.

+0

Я отдам это и вернусь к вам! –

0

x.get('title') возвращается None.

Если вы хотите, чтобы отфильтровать список понимание, без повторения запроса, вы можете создать единый список элементов из результата запроса и отфильтровать его, если он None:

desired_value = [title[8:] for x in desired_value 
       for title in [x.get('title')] 
       if title] 
+0

Я отдам вам это и вернусь к вам! –