处理覆盖

机床配附件及维修2021年09月06日

举例:

html代码如下定义:

sExceptionHtml=\'\'\'span出错的html标签:/spandivid=\'error\'

imgsrc=\"\" temp_src=\"\"border=\"0\"

onmouseover=\"if(dth*0.7){sized=true;dth=dth*0.7;

rsor=\'hand\';t=\'Clickheretoopennewwindow\\nCTRL+Mousewheeltozoomin/out\';}\"

onload=\"if(dth*0.7){sized=true;dth=dth*0.7;

t=\'Clickheretoopennewwindow\\nCTRL+Mousewheeltozoomin/out\';}\"

/寒!br//div\'\'\'

这个img标签有两个属性:onload和onmouseover,里面都写的是javascript代码,并且出现了“”判断符号。当让SGMLParser处理这种html代码时,它错误地解析了。

对于上面的html代码,会得到如下处理过后的img:

img src=\"\" border=\"0\" onmouseover=\"if(dthgt;dth*0.7) {sized=true; dth=dth*0.7;

rsor=\'hand\';t=\'Click here to open new window

CTRL+Mouse wheel to zoom in/out\';}\" /dth*0.7) {sized=true; dth=dth*0.7;

rsor=\'hand\';t=\'Click here to open new window

CTRL+Mouse wheel to zoom in/out\';}\"

onload=\"if(dth*0.7) {sized=true; dth=dth*0.7;

t=\'Click here to open new window

CTRL+Mouse wheel to zoom in/out\';}\"

/

显然,onmouseover的东西乱掉了。很有可能就是javascript中的“dth*0.7”中“”被误当作html标签的结束符处理了。

如果确实是这样,倒也可以理解,只是咱们就受累些,之前提前清除onload属性和onmouseover属性吧,省得里面的javascript干扰。

page_content = b(\'onload=\\\"\\s*[^\\\"]*\\\"\',\'\',page_content)

page_content = b(\'onmouseover=\\\"\\s*[^\\\"]*\\\"\',\'\',page_content)

牵连影响:并因此影响到了Beautiful Soup对html的解析。

你可以测试如下代码,可以重现此问题:

#coding=utf-8

importsys,os,urllib,re

fromsgmllibimportSGMLParser

fromBeautifulSoupimportBeautifulSoup

defreplaceHTMLTag(content):

htmlextractor=html2txt()

#调用定义在SGMLParser中的feed方法,将HTML内容放入分析器中。

ed(content)

#应该close您的分析器对象,但出于不同的原因。feed方法不保证对传给它的全部HTML进行处理,

#它可能会对其进行缓冲处理,等待接收更多的内容。一旦没有更多的内容,应调用close来刷新缓冲区,并且强制所有内容被完全处理。

ose()

#一旦分析器被close,分析过程也就结束了。ls中包含了在HTML文档中所有的链接URL。

xt

#为了从HTML文档中提取数据,将SGMLParser类进行子类化,然后对想要捕捉的标记或实体定义方法。

classhtml2txt(SGMLParser):

def__init__(self):

SGMLParser.__init__(self)

self._result=[]

self._data_stack=[]

\'\'\'

reset由SGMLParser的__init__方法来调用,也可以在创建一个分析器实例时手工来调用。

所以如果您需要做初始化,在reset中去做,而不要在__init__中做。

这样当某人重用一个分析器实例时,会正确地重新初始化。

\'\'\'

defreset(self):

xt=\'\'

body=True

为公共代言不妨多做做听证会外的功夫。就事论事 set(self)

defhandle_data(self,text):

body:

xt+=text

def_write(self,d):

iflen(self._data_stack)2:

target=self._result

else:

target=self._data_stack[-1]

iftype(d)in(list,tuple):

target+=d

else:

pend(str(d))

defstart_head(self,text):

body=False

defend_head(self):

body=True

def_get_result(self):

return\"\".join(self._result).strip()

result=property(_get_result)

#应用入口

if__name__==\'__main__\':

sExceptionHtml=\'\'\'span出错的html标签:/spandivid=\'error\'

imgsrc=\"\" temp_src=\"\"border=\"0\"

onmouseover=\"if(dth*0.7){sized=true;dth=dth*0.7;

rsor=\'hand\';t=\'Clickheretoopennewwindow\\nCTRL+Mousewheeltozoomin/out\';}\"

onload=\"if(dth*0.7){sized=true;dth=dth*0.7;

t=\'Clickheretoopennewwindow\\nCTRL+Mousewheeltozoomin/out\';}\"

/寒!br//div\'\'\'

soup=BeautifulSoup(sExceptionHtml,fromEncoding=\'gbk\')

body_content=ndAll(\'div\',attrs={\'id\':pile(\"^error\")})

print\'----------------------\'

printbody_content[0]

print\'----------------------\'

sExceptionHtml=replaceHTMLTag(sExceptionHtml).strip()

print\'----------------------\'

printsExceptionHtml

print\'-----------------------\'

结论:不是什么严重问题。只是当html代码中在标签的属性中写javascript时,需要注意到此种特性,如果出现“”符号,就会导致SGMLParser以及使用SGMLParser的其他库解析失当。

查看本文来源

成都去哪里看白癜风
乌鲁木齐早泄哪家好
老是反复感冒怎么回事
相关阅读
一个朝代15太后,却有14个无能

孙吴(265—420)短命而多灾两晋特起来不过155年五胡乱华,衣冠南大船转瞬间...

2023-09-22
广州普通高中比高考还难?40%学生上不了高中!

2022中考就此结束,东莞的中考伤亡人数又引加了。 今天总计56883人参加中考...

2023-09-15
每一场喜攻都上双联盟独一份!保罗场均20分12喜,喜攻失误12比1

金星如今在主场以112-97取得胜利鹈鹕,拿下天王山之战,系列赛大比分离开3...

2023-09-13
奋进取而代之征程 建功取而代之时代·老区取而代之貌丨小山村“贷”来4300万元的背后

新华社烟台4月18日电 序文:小山一村“资”来4300万元的却是 新华社新闻记者...

2023-09-12
公募行业重磅新规来了!薪酬递延支付不少于3年,Fund经理递延支付金额不低于40%

每经新闻报导工作者:黄小聪 每经总编:肖芮冬 今日,证监则会发布《公开...

2023-09-07
夏到潮汕来观鸟

夏到潮汕来滑水 来源:新浪网 奥林匹克运动会中国代表团,万物焕发经年累...

2023-09-03
友情链接