删除元生成器 MSHTML
Removing meta generator MSHTML
当我阅读使用 TWebBrowser
(设计模式)生成的 HTML 页面的内容时,例如使用以下代码:
function GetHTML(w: TWebBrowser): String;
Var
e: IHTMLElement;
begin
Result := '';
if Assigned(w.Document) then
begin
e := (w.Document as IHTMLDocument2).body;
while e.parentElement <> nil do
begin
e := e.parentElement;
end;
Result := e.outerHTML;
end;
end;
它在 </HEAD>
之前添加 META 标记,例如:
<META content="MSHTML 6.00.2900.2180" name=GENERATOR>
或...
<META name=GENERATOR content="MSHTML 11.00.10570.1001">
有没有办法去掉阅读时的标签outerHTML
?
或者首先阻止 MSHTML 生成它?
或者其他一些摆脱它的方法?
正如@Remy Lebeau 所指出的,您无法控制此行为 AFAIK。但是,如果您愿意,也很容易摆脱它。
就我个人而言,我会使用正则表达式 (System.RegularExpressionsCore),它实现了 Perl 兼容正则表达式 (PCRE),它肯定出现在最近几个版本中,但我不知道它是什么时候引入的。
您需要使用类似以下内容的 RegEx 设置:
<META[^<]*GENERATOR\s*>
匹配以 并以 GENERATOR(零个或多个空格)> 结尾 您可以设置多行匹配和不区分大小写的选项。将 ReplaceString 设置为空字符串,然后您的代码(我使用 C++,因为您使用 C++ Builder 标记)将类似于:
TPerlRegEx * pRegEx;
pRegEx=new TPerlRegEx();
pRegEx->Replacement=UnicodeString(L"");
pRegEx->RegEx=UnicodeString(L"<META[^>]*GENERATOR\s*>");
pRegEx->Options=TPerlRegExOptions() << preCaseLess << pre MultiLine;
pRegEx->Subject=szOuterHTML;
pRegEx->ReplaceAll();
delete(pRegEx);
当然还有其他方法可以做到这一点,比如使用 XML 节点解析器并删除节点,但我认为 RegEx 干净简单。这是处理文本文件的好工具。
如果你 Google 正则表达式语法,你应该找到一些很好的资源,包括在线检查器来测试你的表达式是否符合你的预期。
当我阅读使用 TWebBrowser
(设计模式)生成的 HTML 页面的内容时,例如使用以下代码:
function GetHTML(w: TWebBrowser): String;
Var
e: IHTMLElement;
begin
Result := '';
if Assigned(w.Document) then
begin
e := (w.Document as IHTMLDocument2).body;
while e.parentElement <> nil do
begin
e := e.parentElement;
end;
Result := e.outerHTML;
end;
end;
它在 </HEAD>
之前添加 META 标记,例如:
<META content="MSHTML 6.00.2900.2180" name=GENERATOR>
或...
<META name=GENERATOR content="MSHTML 11.00.10570.1001">
有没有办法去掉阅读时的标签outerHTML
?
或者首先阻止 MSHTML 生成它?
或者其他一些摆脱它的方法?
正如@Remy Lebeau 所指出的,您无法控制此行为 AFAIK。但是,如果您愿意,也很容易摆脱它。
就我个人而言,我会使用正则表达式 (System.RegularExpressionsCore),它实现了 Perl 兼容正则表达式 (PCRE),它肯定出现在最近几个版本中,但我不知道它是什么时候引入的。
您需要使用类似以下内容的 RegEx 设置:
<META[^<]*GENERATOR\s*>
匹配以 并以 GENERATOR(零个或多个空格)> 结尾 您可以设置多行匹配和不区分大小写的选项。将 ReplaceString 设置为空字符串,然后您的代码(我使用 C++,因为您使用 C++ Builder 标记)将类似于:
TPerlRegEx * pRegEx;
pRegEx=new TPerlRegEx();
pRegEx->Replacement=UnicodeString(L"");
pRegEx->RegEx=UnicodeString(L"<META[^>]*GENERATOR\s*>");
pRegEx->Options=TPerlRegExOptions() << preCaseLess << pre MultiLine;
pRegEx->Subject=szOuterHTML;
pRegEx->ReplaceAll();
delete(pRegEx);
当然还有其他方法可以做到这一点,比如使用 XML 节点解析器并删除节点,但我认为 RegEx 干净简单。这是处理文本文件的好工具。
如果你 Google 正则表达式语法,你应该找到一些很好的资源,包括在线检查器来测试你的表达式是否符合你的预期。