处理覆盖
举例:
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