Nokogiri использует простой тест, чтобы определить, является ли документ HTML или XML, когда вы вызываете универсальный метод Nokogiri.parse
. Я видел, что возвращает неправильные результаты , и лучшее решение - это помочь Нокогири немного больше.
Вместо использования parse
, используйте Nokogiri::XML('some xml string')
или Nokogiri::HTML('some html string')
, и это всегда будет делать правильно. См. Анализ документа HTML / XML .
XML по определению должен проверяться. Nokogiri полезен и попытается проанализировать недопустимый XML (иначе он не сможет разобрать HTML), но когда он обнаружит плохой XML, он отметит проблему, используя массив errors
в качестве оболочки. Если вы знаете, источник документа надежный, тогда вы можете пропустить проверку, но это так просто, что вы могли бы сделать что-то вроде doc.errors.any?
и отреагировать, если это правда.
Вы не говорите, какой тип XML вы пытаетесь проанализировать, но есть XML, а затем есть XML, который вы хотите. Ваш Xpath предполагает, что вы пытаетесь разобрать канал. Я столкнулся с таким количеством плохих XML-каналов, что не удивлен, что вы столкнулись с ошибками. Nokogiri пытается понять условия реального мира, но иногда этого недостаточно, и вы должны сказать Nokogiri быть более снисходительным при разборе. См. Опции для Nokogiri::XML
, чтобы получить флаги.
Вы также говорите в своем комментарии к выбранному ответу, что документ хорошо открывается в браузере. Браузер не является хорошим показателем того, является ли документ действительным, потому что браузеры не выполняют валидацию, а вместо этого делают все возможное, чтобы представить что-то читабельное, даже если это не совсем правильно. Синтаксический анализатор, такой как Nokogiri, должен быть намного более жестким при разборе, потому что человеческий мозг не интерпретирует результаты. Код, извлекающий данные из XML, не так прост, как ошибки.