Ошибка «NoneType» при попытке установить атрибуты для первого тега из проанализированного PDF-документа в Python с BeautifulSoup4 - PullRequest
1 голос
/ 21 марта 2019

Я пишу скрипт на Python, используя pdfminer.six для конвертации огромного количества PDF-файлов в html для последующей загрузки их в интернет-магазин.До сих пор основные текстовые блоки были проанализированы довольно хорошо, но в процессе я должен был заменить все промежутки на div (и убрать промежутки из их атрибутов) по очевидным причинам, поэтому теперь структура документа выглядит следующим образом:

<div> #first main block
    <div>
        Product desc heading
    </div>
    <div>
        Product desc text
    </div>
    #etc etc
</div>

<div> #second main block
    <div>
        Product specs heading
    </div>
    <div>
        Product specs text
    </div>
    #etc etc
</div>

Проблема заключается в навигации в идентичных div.Если я попытаюсь найти самый первый div и добавить к нему некоторые атрибуты, например, docs предложить:

firstdiv = soup.find('div')
firstdiv['class'] = 'main_productinfo'

Результат вполне предсказуемый - IDLE выводит следующую ошибку:

File "C:\Users\blabla\AppData\Local\Programs\Python\Python37\lib\site-packages\bs4\element.py", line 1036, in __setitem__
    self.attrs[key] = value
TypeError: 'NoneType' object does not support item assignment

, поскольку метод find() не возвращает определенного результата (может найти или не найти).

Я хочу деформировать первый блок в каждом файле и затем проанализироватьтаблиц (находится в блоке спецификации ниже) в HTML и объединить эти две в каждом загружаемом файле.Как я могу добавить атрибуты к первому тегу, не конвертируя суп в строку снова и снова (и, таким образом, делая его действительно, очень уродливым, поскольку он конвертирует недавно улучшенный суп без каких-либо пробелов) и заменяя части строки в str(soup)?Я довольно новичок в Python, и ничего не приходит на ум.

UPD: я использую Python 3.7.2 на Win 7 64.

1 Ответ

0 голосов
/ 22 марта 2019

Я не получаю эту ошибку:

import bs4

html = '''<div> #first main block
    <div>
        Product desc heading
    </div>
    <div>
        Product desc text
    </div>
    #etc etc
</div>

<div> #second main block
    <div>
        Product specs heading
    </div>
    <div>
        Product specs text
    </div>
    #etc etc
</div>'''

soup = bs4.BeautifulSoup(html, 'html.parser')

firstdiv = soup.find('div')

Выход:

print (firstdiv)
<div> #first main block
    <div>
        Product desc heading
    </div>
<div>
        Product desc text
    </div>
    #etc etc
</div>

Тогда:

firstdiv['class'] = 'main_productinfo'
print (firstdiv)

<div class="main_productinfo"> #first main block
    <div>
        Product desc heading
    </div>
<div>
        Product desc text
    </div>
    #etc etc
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...