Во-первых, корневой объект, в вашем случае переменная soup
, является объектом BeautifulSoup
.Вы можете думать об этом как о document
объекте в браузере.В BeautifulSoup объект BeautifulSoup
является производным от объекта Element
, но на самом деле он не является «элементом», он больше похож на документ.
Когда вы вызываете len
дляэлемент (или объект BeautifulSoup), вы получите количество узлов в contents
член объекта.Это может содержать комментарии, операторы обработки документов, текстовые узлы, узлы элементов и т. Д.
Хорошо сформированный документ должен иметь один корневой элемент, но комментарии и операторы обработки документов также подходят для корневого уровня.В вашем случае, без комментариев и операторов обработки, я бы обычно ожидал, что длина 1.
lxml
и html5lib
попытается убедиться, что у вас есть правильно сформированный документ, если он видит, что у вас естьнесколько корневых элементов, они обернут его в теги html
и body
и дадут вам один корневой элемент.Хотя, как упоминалось ранее, вы можете иметь длину> 1, если ваш документ уже имеет правильный корневой элемент html
, а также имеет комментарии или операторы обработки на корневом уровне.В зависимости от синтаксического анализатора они могут манипулировать другим контентом, чтобы придерживаться любых правил, которые они также применяют, когда снабжены странным искаженным HTML.
С другой стороны.html.parser
очень снисходительно.Он не пытается исправить то, что вы делаете, а просто анализирует вещи такими, какие они есть.В вашем случае он возвращает странный документ с несколькими текстовыми узлами на корневом уровне, а также с несколькими элементами <p>
на корневом уровне.Поэтому, когда вы вызываете length для soup
, вы получаете значение, намного превышающее 1.
В общем.Начальным элементом, возвращаемым BeautifulSoup, является объект BeautifulSoup
.Он может содержать Element
узлов или NaviagableString
узлов (текст), которые могут быть различных подтипов, если это зависит от того, являются ли они комментарием, удалением документа, CDATA или другим оператором обработки.NaviagableStrings
(и связанные подтипы) не являются Element
узлами, но обычно содержатся в содержимом объекта Element
или BeautifulSoup
.
В зависимости от того, предпочитаете ли вы снисходительность, скорость, HTML5правильность, поддержка XML и т. д., это может повлиять на то, какой парсер вы хотите использовать.Кроме того, иногда вы можете использовать другие парсеры для очень специфических случаев.