视窗
loading...
您现在的位置:首页 > IT认证 > JAVA >

Java基础知识:Jtidy解析脚本时候出现问题


问题描述:

    最近在做网页结构化信息抽取,用到了JTidy和xslt.当在处理一些包含很多脚本的页面时候,出现了,JTidy去脏失败,提示标题中的异常。

    最后发现,问题出现在解析脚本的时候因为一些脚本里面不规范的内容,导致不能判断结束造成了上面的异常出现。

    解决方法:

    最初的时候想通过修改JTidy的源码来解决这个问题,但是后来做着发现可行性不高,一个是修改这个源码可能会带来其它的问题。另外一个,还要花长时间去看源码。

    所以,最终还是选择了采用预处理的方式来进行处理删除掉脚本。

    代码

    [java]

    public static String getFilterBody(String strBody) {

    // htmlparser 解析

    Parser parser = Parser.createParser(strBody, "utf-8");

    NodeList list;

    String reValue = strBody;

    try {

    list = parser.parse(null);

    visitNodeList(list);

    reValue = list.toHtml();

    } catch (ParserException e1) {

    }

    return reValue;

    }

    // 递归过滤

    private static void visitNodeList(NodeList list) {

    for (int i = 0; i < list.size(); i++) {

    Node node = list.elementAt(i);

    if (node instanceof Tag) {

    if (node instanceof ScriptTag) {

    list.remove(i);

    continue;

    }// 这里可以增加删除的Tag

    if (node instanceof StyleTag) {

    list.remove(i);

    continue;

    }// 这里可以增加删除的Tag

    }

    NodeList children = node.getChildren();

    if (children != null && children.size() > 0)

    visitNodeList(children);

    }

    }

    但是在删除脚本的时候一样遇到了相同的问题,就是在解析脚本的时候出现了错乱,把一些脚本中的标签识别为正常标签。如:<script>里面的 '<span></span>'里面的'</'就会被识别为脚本的结束,导致脚本获取不全,删除不全最后在网上找到了解决的办法通过下面两个参数的设置来解析了html对脚本的处理问题

    [java]

    org.htmlparser.scanners.ScriptScanner.STRICT = false;

    org.htmlparser.lexer.Lexer.STRICT_REMARKS = false;

    只要配置其中之一就可以了,下面是这两个参数的一个官方说明

    org.htmlparser.scanners.ScriptScanner.STRICT = false;

    [java]

    /**

    * Strict parsing of CDATA flag.

    * If this flag is set true, the parsing of script is performed without

    * regard to quotes. This means that erroneous script such as:

    * <pre>

    * document.write("</script>");

    * </pre>

    * will be parsed in strict accordance with appendix

    * <a href="/TR/html4/appendix/notes.html#notes-specifying-data" mce_href="/TR/html4/appendix/notes.html#notes-specifying-data">

    * B.3.2 Specifying non-HTML data</a> of the

    * <a href="/TR/html4/" mce_href="/TR/html4/">HTML 4.01 Specification</a> and

    * hence will be split into two or more nodes. Correct javascript would

    * escape the ETAGO:

    * <pre>

    * document.write("<//script>");

    * </pre>

    * If true, CDATA parsing will stop at the first ETAGO ("</") no matter

    * whether it is quoted or not. If false, balanced quotes (either single or

    * double) will shield an ETAGO. Beacuse of the possibility of quotes within

    * single or multiline comments, these are also parsed. In most cases,

    * users prefer non-strict handling since there is so much broken script

    * out in the wild.

    */

    org.htmlparser.lexer.Lexer.STRICT_REMARKS = false;

    [java]

    /**

    * Process remarks strictly flag.

    * If <code>true</code>, remarks are not terminated by ---$gt;

    * or --!$gt;, i.e. more than two dashes. If <code>false</code>,

    * a more lax (and closer to typical browser handling) remark parsing

    * is used.

    * Default <code>true</code>.

    */

    在默认情况下,htmlparser解析是按严格的html标准解析,所以当碰到不标准的标签有可能出错,

    当把以上这两个参数改变以后,htmlparser解析不再严格,能应对所有可能出现的情况。

闂傚倷绶氬ḿ褍螞瀹€鍕;闁跨噦鎷�

闂傚倷绶氬ḿ褍螞瀹€鍕;闁跨噦鎷�

闂傚倷绶氬ḿ褍螞濞嗘挸绀夐柡鍥ュ灩閸屻劑鏌曢崼婵囧閻庢艾顭烽弻銊モ攽閸℃ê鐝旂紓浣瑰敾缂嶄線寮婚敓鐘茬妞ゆ劧瀵岄埀顒侇殜閺岀喖鎽庨崒姘ギ闂佽鍟崶褔鍞堕梺缁樻煥閹芥粎绮旈鍕厽闁绘ê寮堕幖鎰版煟鎺抽崝灞藉祫闂佺鎻粻鎴g箽闂備浇娉曢崳锕傚箯閿燂拷
闂傚倷绀侀幖顐︽偋濠婂牆绀堟繛鎴欏灪閸嬬喐銇勯弽顐沪闁绘帡绠栭弻鏇熺箾閸喖濮庨梺璇叉唉椤曆嗗絹闂佹悶鍎荤徊鑺ユ櫠閹绘崡褰掓偂鎼淬垹娈楅悗娈垮枛閻栧吋淇婇悜鑺ユ櫆闁告挆鍐帗婵犵數鍋涢悺銊у垝瀹€鈧懞閬嶆嚃閳哄嫬小婵炲鍘ч悺銊╁吹閸岀偞鐓涢柛鎰╁妼閳ь剝宕电划鏃囥亹閹烘挾鍙嗗┑鐐村灱濞呮洜鈧熬鎷�闂備浇顕уù鐑藉极閹间降鈧焦绻濋崑顖氱秺瀹曞崬螣鐠囧樊娼梻浣风串缁蹭粙寮甸鍕仼闁告鍊戞惔銊ョ倞闁挎繂鎳庨埛澶嬬箾鐎电ǹ甯堕柟铏耿閻涱喚鈧綆鍠栫粻锝嗙節婵犲倸顏柟鏋姂濮婃椽宕ㄦ繝鍐f嫻缂備礁顑嗙敮锟犲箚閸ャ劌顕遍柡澶嬪灥閸炪劑姊洪幖鐐插姌闁告柨绉归敐鐐哄冀椤儱閰e畷鍫曟晲閸涱厸鎷ゅ┑鐐差嚟閸樠囧箠濮椻偓楠炲棝宕橀鑲╊槹濡炪倖鍔戦崹娲儊閺冣偓缁绘繈濮€閿濆棛銆愰柣搴㈣壘閹芥粌危閹扮増鏅搁柨鐕傛嫹闂傚倷鑳堕幊鎾绘偤閵娾晛鍨傞柛鎰ゴ閸亪鏌熺€电ǹ小闁绘帒锕ら埞鎴︽偐閸欏鎮欏┑鐐叉噷閸ㄥ綊婀侀梺鎸庣箓濡盯鎯屾惔銊︾厓鐟滄粓宕滃▎鎾崇疇闁归偊鍏橀弸鏃堟煙鏉堥箖妾柛瀣儔閺屾盯顢曢妶鍛€剧紓鍌氱М閸嬫捇姊绘担鐟扮亰闁绘帪绠撴俊鐢告倷閻㈢數顦梺鍝勫暙閻楀棛鐥閺屾盯骞囬娑氥€婄紓浣插亾闁跨噦鎷�闂備浇顕х花鑲╁緤婵犳熬缍栧鑸靛姇閸ㄥ倹绻濇繝鍌氼伀妞も晠鏀遍妵鍕箳閹存繃娈茬紓浣风贰閸o絽顕i崼鏇熷€烽柛顭戝亝閻濐亜鈹戦悙鑼闁搞劌澧庣划姘舵焼瀹ュ懐鍔撮梺鍛婂壃閸涱垼妲繝鐢靛Х椤d粙鍩€椤掆偓閸熷潡鍩€椤掑倹鍤€闁挎洏鍨洪幏鍛村礈閹绘帗顓块梻浣呵归張顒傛崲瀹ュ鑸归柟缁㈠枟閻撴瑩鎮楀☉娆嬬細濠⒀屽墯缁绘繈鍩€椤掍焦濯撮柛锔诲幘閹虫繈姊洪崜鑼帥闁稿鎳愮槐鐐哄焵椤掑嫭鈷戦柣鐔稿閹界娀鏌eΔ鍐ㄤ户闁瑰箍鍨归~婵嬵敄閼恒儳浜欓梻浣告惈濞诧箓鎯岄鐐床闁糕剝绋掗悡娆愩亜閹炬鍟版禒鏉戭渻閵堝棙澶勯柛鎾跺枎閻g兘鏁愰崱娆戠槇闂佸憡鍔忛弲鈺佄i鐐粹拺闁奸€涘嵆閸濈儤鎱ㄦ繝鍌ょ吋闁哄苯鐗撻獮姗€顢欓懖鈺婂悈闂備胶鎳撻悺銊у垝瀹ュ洤鍨濋柨鏇炲€归悡銉︾箾閹寸倖鎴濓耿閻楀牏绡€闁逞屽墴楠炲秹顢欓幆褍瑙︽繝鐢靛仜濡霉妞嬪海鐜绘俊銈呭暟绾惧ジ鏌¢崒娑卞劌闁稿骸绻掗埀顒冾潐閹哥ǹ螞濠靛棛鏆︽慨妯垮煐閸嬫劗绱撴担璐細鐟滅増鍨垮娲箰鎼粹€虫灆闂佺懓鍤栭幏锟�闂備浇顕уù鐑藉极閹间礁绠犻柟鎹愬煐閺嗘粍銇勯幇鍓佺暠缂佲偓閸℃ḿ绠鹃柟瀵镐紳椤忓牆鏋侀柛顐f礃閸婄數鐥鐐村婵炲吋鍔欓弻娑㈠Ω閿斿墽鐓佺紓浣稿€圭敮锟犮€佸Δ浣瑰缂佸鏅濋锔解拺閻熸瑥瀚欢鑼磼缂佹ê鐏寸€殿噮鍋婇、娆撴偩瀹€濠冪カ婵犳鍠楅妵娑㈠磻閹剧粯鐓冪憸婊堝礈濞嗘挸纾归柛婵勫劤缁€濠囨倵閿濆骸鏋熼柛搴$Ч閺屾盯寮撮妸銉ョ瑢閻熸粎澧楃敮妤呮偂閳ь剙顪冮妶鍡楃瑨闁挎洩濡囩划鍫ユ晸閿燂拷闂傚倷娴囨竟鍫熴仈缁嬫娼栧┑鐘崇閻掗箖鏌熺紒銏犳灈婵☆偅锕㈤弻锝夋偄缁嬫妫嗙紒缁㈠幐閸嬫捇姊绘担鐟邦嚋缂佸甯掗悾婵嬪箹娴e摜锛涢梺鍝勭Р閸斿酣銆呴悜鑺ョ叆闁绘洖鍊圭€氾拷:webmaster@jscj.com闂傚倷绶氬ḿ褍螞瀹€鍕;闁瑰墽绮悡鐔搞亜椤愵偄骞樼紒浣哄厴閺岋綁鏁傜捄銊х厯闂佽桨绀佺粔褰掑极閹剧粯鏅搁柨鐕傛嫹4008816886

相关文章

无相关信息
更新时间2022-09-16 10:07:22【至顶部↑】
联系我们 | 邮件: webmaster@jscj.com | 客服热线电话:4008816886(QQ同号) |  婵犵數濮烽弫鎼佸磿閹寸姷绀婇柍褜鍓氶妵鍕即閸℃顏柛娆忕箻閺岋綁骞囬鍛瘜闂佺ǹ顑嗛幑鍥偘椤曗偓瀹曞綊顢欓崣銉ф/濠电姷鏁告慨顓㈠磻閹剧粯鐓曢柕澶嬪灥閼活垰鈻撻銏╂富闁靛牆妫欓ˉ鍡樸亜閺傚尅鍔熼柟骞垮灲閺佹捇鏁撻敓锟�

付款方式留言簿投诉中心网站纠错二维码手机版

电话:
付款方式   |   给我留言   |   我要纠错   |   联系我们