自从防复制代码从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             // &nbsp; - 空格
50             if  (tmpSub  =   ' &nbsp; ' 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中有可能存在转义字符(最常见的是&nbsp;),处理方法见代码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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐