自从防复制代码从JS屏蔽鼠标右键升级到随机插入乱码+版权信息后,要整理复制出来的文字变得相当困难。有些网站无所不用其极,每行文字前后都有差乱码,其中还混杂了大量空格、单词、随机汉字...
俗话说魔高一尺,“盗”高一仗,学了这么久WebBrowser技术,总该有点成果了。
这里就以盗取(呃..口误,是“复制”...复制)BBS上可见字符为目标,写一个可以过滤某BBS不可见乱码的程序。
其实这个程序很简单,首先是如何获取选定部分的HTML,还记得这段吗:
HTMLDoc := WebBrowser1.Document as IHTMLDocument2;
SelectRange := HTMLDoc.selection.createRange() as IHTMLTxtRange;
这样 SelectRange.htmlText 就是选择部分的HTML了。
接着来实现 TrimBBSText() 函数,用于去除复制文字中的不可见乱码。
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
所有评论(0)