Kon*_*zev 6 html delphi parsing mshtml
我正在尝试通过Delphi 10 Seattle中的MSHTML解析器解析HTML.它运行正常,但是ARTICLE标签混淆了它,解析了ARTICLE元素没有innerHTML和children,尽管它们在那里.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Variants,
ActiveX,
MSHTML;
procedure DoParse;
var
idoc: IHTMLDocument2;
iCollection: IHTMLElementCollection;
iElement: IHTMLElement;
V: OleVariant;
HTML: String;
i: Integer;
begin
Html :=
'<html>'#10+
'<head>'#10+
' <title>Articles</title>'#10+
'</head>'#10+
'<body>'#10+
' <article>'#10+
' <p>This is my Article</p>'#10+
' </article>'#10+
'</body>'#10+
'</html>';
v := VarArrayCreate( [0,1], varVariant);
v[0]:= Html;
idoc := CoHTMLDocument.Create as IHTMLDocument2;
idoc.designMode := 'on';
idoc.write(PSafeArray(System.TVarData(v).VArray));
idoc.close;
iCollection := idoc.all as IHTMLElementCollection;
for i := 0 to iCollection.length-1 do
begin
iElement := iCollection.item( i, 0) as IHTMLElement;
if assigned(ielement) then
WriteLN(iElement.tagName + ': ' + iElement.outerHTML);
end;
end;
begin
try
DoParse;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLN;
end.
Run Code Online (Sandbox Code Playgroud)
程序的输出是
HTML: <HTML><HEAD><TITLE>Articles</TITLE>
<META name=GENERATOR content="MSHTML 11.00.9600.18283"></HEAD>
<BODY><ARTICLE>
<P>This is my Article</P></ARTICLE>undefined</BODY></HTML>
HEAD: <HEAD><TITLE>Articles</TITLE>
<META name=GENERATOR content="MSHTML 11.00.9600.18283"></HEAD>
TITLE: <TITLE>Articles</TITLE>
META:
<META name=GENERATOR content="MSHTML 11.00.9600.18283">
BODY:
<BODY><ARTICLE>
<P>This is my Article</P></ARTICLE>undefined</BODY>
ARTICLE: <ARTICLE>
P:
<P>This is my Article</P>
/ARTICLE: </ARTICLE>
Run Code Online (Sandbox Code Playgroud)
如您所见,ARTICLE标记存在错误,它没有内容,而/ ARTICLE被定义为单独的标记.
有人可以帮我理解这个问题吗?
请参阅docs:custom element | 自定义对象.
Windows Internet Explorer对HTML页面上的自定义标记的支持要求为标记定义名称空间.否则,在解析文档时,自定义标记将被视为未知标记.虽然在Internet Explorer中导航到具有未知标记的页面不会导致错误,但未知标记的缺点是无法 包含其他标记,也不能将行为应用于它们.
在你的情况下ARTICLE是一个未知的标签.要使其成为可以包含其他标记的自定义标记,您需要为其添加名称空间.例如<MY:ARTICLE>,声明命名空间<html XMLNS:MY>(如果你没有声明命名空间,DOM解析器会自动添加它)
另请参阅:在Internet Explorer中使用自定义标记
在您的评论中,您提到您正在尝试解析实时HTML5页面(您没有在问题中提到过).
由于我不是HTML5专家,因此我没有将ARTICLE标签与HTML5标准相关联.
默认情况下,您的程序在IE7兼容模式下运行,因此MSHTML不知道此特殊标记并将其视为未知标记.
因此,要么尝试添加<!DOCTYPE html>HTML作为第一行,又要添加<meta http-equiv="X-UA-Compatible" content="IE=edge">为该HEAD部分的第一行(必须是第一行).或者尝试添加FEATURE_BROWSER_EMULATION注册表项:如何在IE9模式下运行Delphi TWebbrowser组件?
PS:idoc.designMode := 'on';不需要.
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |