BeautifulSoup: AttributeError: у объекта 'NavigableString' нет атрибута 'name' - PullRequest
14 голосов
/ 29 сентября 2011

Знаете ли вы, почему первый пример в руководстве по BeautifulSoup http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStart дает AttributeError: 'NavigableString' object has no attribute 'name'? Согласно этому ответу пробелы в HTML вызывают проблему. Я попытался с источниками нескольких страниц, и 1 работал, другие дали ту же ошибку (я удалил пробелы). Можете ли вы объяснить, что означает «имя» и почему происходит эта ошибка? Благодарю.

Ответы [ 3 ]

18 голосов
/ 29 сентября 2011

name будет ссылаться на имя тега, если объект является Tag объектом (то есть: <html> name = "html")

, если в разметке между ними есть пробелыузлы BeautifulSoup превратят их в NavigableString.Поэтому, если вы используете индекс contents для захвата узлов, вы можете получить NavigableString вместо следующего Tag.

Чтобы избежать этого, запросите искомый узел: Поиск в дереве разбора

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

Если вы хотите использовать contents, вам нужно проверить объекты, с которыми вы работаете.Получаемая ошибка означает, что вы пытаетесь получить доступ к свойству name, потому что код предполагает, что это Tag

7 голосов
/ 25 сентября 2016

Просто игнорируйте NavigableString объекты во время итерации по дереву:

response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for body_child in soup.body.children:
    if isinstance(body_child, NavigableString):
        continue
    if isinstance(body_child, Tag):
        print(body_child.name)
7 голосов
/ 25 декабря 2013

Вы можете использовать try catch, чтобы исключить случаи, когда Navigable String анализируется в цикле, например:

    for j in soup.find_all(...)
        try:
            print j.find(...)
        except NavigableString: 
            pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...