gpt4 book ai didi

html - 高效的Delphi方法解析HTML代码获取数据

转载 作者:行者123 更新时间:2023-12-05 05:55:43 25 4
gpt4 key购买 nike

有时我需要像这样解析数据:

<tr>
<td data-th="Name">
John Smith
</td>
<td data-th="Phone">
1234567
</td>
<td data-th="Postal">
16803
</td>
<td data-th="Office Number">
12345678
</td>
<td data-th="Remarks">
Hello
</td>
</tr>
<tr>
<td data-th="Name">
Mary Smith
</td>
<td data-th="Phone">
1234589
</td>
<td data-th="Postal">
16801
</td>
<td data-th="Office Number">
2385234
</td>
<td data-th="Remarks">
Hi There
</td>
</tr>

我会做一些事情,比如将它加载到 TStringList:

for i := 0 to oStringList.Count-1 do
begin
if oStringList[i].Trim = '<tr>' then
begin
// start of record
end else if oStringList[i].Trim = '</tr>' then
begin
// end of record
end else
begin
// part of record data
end;
end;

有没有更好的方法来做到这一点,要么通过一些非常高效的代码,要么已经有一些非常好的 Delphi 组件(最好是免费/开源的)可以完成这个?我在 stackoverflow 中看到一个线程(3 多年前)提到了一个组件,只是想知道是否有更好的东西出现。

谢谢。

更新:尝试使用 htmlp 组件 --> 我如何配置代码来解析以上数据...粗略示例没有帮助。我想遍历每个 TR/TR 并得到

  var HtmlParser: THtmlParser;
var HtmlDoc: TDocument;
var x: Integer;
var body, el: TElement;
var node: TNode;
begin
HtmlParser := THtmlParser.Create;
try
HtmlDoc := HtmlParser.parseString(memo1.Text);
try
body := GetDocBody(HtmlDoc);
if Assigned(body) then
for x := 0 to body.childNodes.length - 1 do
begin
node := body.childNodes.item(x);
if (node is TElement) then
begin
el := node as TElement;
if (el.tagName = 'td') then //and (el.GetAttribute('data-th') = 'Name') then
begin
// iterate el.childNodes here...
//ShowMessage(IntToStr(el.childNodes.length));
memo1.Lines.Add(IntToStr(el.childNodes.length));
end else
begin

end;
end else
begin
memo1.Lines.Add('node is not element');
end;
end;
finally
HtmlDoc.Free;
end;
finally
HtmlParser.Free
end;
end;

最佳答案

当它是像这样格式良好的 HTML 时,开始条目也有结束条目 (<TR>...</TR>),那么它基本上就是 XML。因此,您可以使用 XML 阅读器来解析文档。

像这样使用 kbmMW 的 XML 解析器:

const
HTML =
' <tr>'+
' <td data-th="Name">'+
' John Smith'+
' </td>'+
' <td data-th="Phone">'+
' 1234567'+
' </td>'+
' <td data-th="Postal">'+
' 16803'+
' </td>'+
' <td data-th="Office Number">'+
' 12345678'+
' </td>'+
' <td data-th="Remarks">'+
' Hello'+
' </td>'+
'</tr>'+
'<tr>'+
' <td data-th="Name">'+
' Mary Smith'+
' </td>'+
' <td data-th="Phone">'+
' 1234589'+
' </td>'+
' <td data-th="Postal">'+
' 16801'+
' </td>'+
' <td data-th="Office Number">'+
' 2385234'+
' </td>'+
' <td data-th="Remarks">'+
' Hi There'+
' </td>'+
'</tr>';

procedure TForm1.Button1Click(Sender: TObject);
var
xml:TkbmMWDOMXML;
i,j:integer;
nTR,nTD:TkbmMWDOMXMLNodeList;
n1,n2:TkbmMWDOMXMLNode;
begin
Memo1.Clear;
xml:=TkbmMWDOMXML.Create(HTML);
try
nTR:=xml.Root.ChildrenByName['tr'];
try
for i:=0 to nTR.Count-1 do
begin
n1:=nTR.Nodes[i];
nTD:=n1.ChildrenByName['td'];
try
for j:=0 to nTD.Count-1 do
begin
n2:=nTD.Nodes[j];
Memo1.Lines.Add(n2.AttribByName['data-th']+'='+n2.Data);
end;
finally
nTD.Free;
end;
end;
finally
nTR.Free;
end;
finally
xml.Free;
end;
end;

结果:

Name=John Smith
Phone=1234567
Postal=16803
Office Number=12345678
Remarks=Hello
Name=Mary Smith
Phone=1234589
Postal=16801
Office Number=2385234
Remarks=Hi There

免费社区版中包含 kbmMW XML 解析器以及更多其他内容,注册后可从 https://portal.components4developers.com 下载。

关于html - 高效的Delphi方法解析HTML代码获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69376791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com