[开源]WebBrowser进阶 - 可见字符复制(一次解决BBS上插入的不可见乱码)
自从防复制代码从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;
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