[开源]WebBrowser进阶 - 可见字符复制(一次解决BBS上插入的不可见乱码)

it2022-05-05  148

自从防复制代码从JS屏蔽鼠标右键升级到随机插入乱码+版权信息后,要整理复制出来的文字变得相当困难。有些网站无所不用其极,每行文字前后都有差乱码,其中还混杂了大量空格、单词、随机汉字...

俗话说魔高一尺,“盗”高一仗,学了这么久WebBrowser技术,总该有点成果了。 这里就以盗取(呃..口误,是“复制”...复制)BBS上可见字符为目标,写一个可以过滤某BBS不可见乱码的程序。


其实这个程序很简单,首先是如何获取选定部分的HTML,还记得这段吗:

  HTMLDoc := WebBrowser1.Document as IHTMLDocument2;   SelectRange := HTMLDoc.selection.createRange() as IHTMLTxtRange;

这样 SelectRange.htmlText 就是选择部分的HTML了。

 

接着来实现 TrimBBSText() 函数,用于去除复制文字中的不可见乱码。

 1  { ******************************************  2   *  3   *  TrimBBSText() 伪代码  4   *  5   ****************************************** }  6  function  TrimBBSText(aBBSStr: String): String;  7  var  8    tmpStr, tmpSub: String;  9    iCharPos: Integer; 10  begin 11    iCharPos : =   1 ; 12     // 从tmpStr的第一个字符到最后一个 13     while  (iCharPos  <=  Length(tmpStr))  do 14     begin 15       case  tmpStr[iCharPos]  of    // 检查当前字符 16  17         ' < ' :    { -HTML标记处理- } 18           begin 19             // 取标签内容 20            tmpSub : =  HTML标签内容; 21  22             if  ( 是 < BR >  )  then 23             begin 24              Result : =  Result  +  # 13 # 10 ;     // 换成换行符 CRLF = #13#10 25              Continue; 26             end ; 27  28             // 第一种隐藏方式,SPAN标签加 DISPLAY: none 29             if  ( 是 < SPAN style = "DISPLAY: none" >  )  then 30             begin 31               // 跳过直到SPAN标签结束 32              Continue; 33             end ; 34  35             // 第一种隐藏方式,字体大小 font-size: 0px; 36             if  ( 是 < FONT style = "font - size: 0px; " >  )  then 37             begin 38               // 跳过直到FONT标签结束 39              Continue; 40             end ; 41  42             // 其他标签处理 43            Continue; 44           end ; 45  46         ' & ' :    { -转义字符处理- } 47           begin 48            tmpSub : =  取转义字符内容; 49             //   - 空格 50             if  (tmpSub  =   '   ' then 51             begin 52              Result : =  Result  +   '   ' ; 53              Continue; 54             end ; 55  56             // 在这里处理其他标记,否则直接贴上转义字符 57            Result : =  Result  +  tmpSub; 58           end ; 59  60         else 61           begin 62             // 其他字符不处理 63            Result : =  Result  +  tmpStr[iCharPos]; 64           end ; 65       end ; 66      Inc(iCharPos); 67     end ; 68  end ;

 

实际上就是自己处理HTML标签,遇到 DISPLAY: none font-size: 0px 的字符就给跳过。这样一来,剩下的就是真实可见部分了。另外要注意的是,HTML中有可能存在转义字符(最常见的是 ),处理方法见代码46行。

另外,还可以用IHTMLDocument3接口去处理HTML标记并获取内容,只不过那个方法处理起来比这个循环还麻烦,以后有机会再演示一下。

代码中只处理了 SPAN标签DISPLAY: none 和 FONT标签font-size: 0px 两种情况,如果要想程序通用,还需在代码中加入更多对不可见字符的识别。

 

源码(Source):BBSText_src.rar 可执行程序:论坛文字提取_bin.rar

转载于:https://www.cnblogs.com/bits/archive/2009/03/09/Delphi-WebBrowser_BBSText_copy.html

相关资源:各显卡算力对照表!

最新回复(0)