【问题标题】:Using Indy httpserver to find keywords in a webpage [duplicate]使用 Indy httpserver 在网页中查找关键字 [重复]
【发布时间】:2013-04-16 10:16:36
【问题描述】:

我正在尝试使用 Indy http 服务器在网页中查找用于代理过滤器的关键字。我已经设置了一个代理和 http 服务器,它适用于 web 浏览器,但是在网页中查找关键字时我正在苦苦挣扎。

我一直在尝试将内存流转换为字符串并在其中搜索关键字,但也许这是错误的做法。我对 delphi 的经验有限,所以我有点卡住了。

如果有人能指点我,那就太好了。

谢谢。

编辑:好的,我在这里添加了一个函数,其中 'Stream' 是来自 http 服务器的内存流,而 'what' 是我正在搜索的关键字,但它似乎不起作用....

function FindInMemStream(Stream: TMemoryStream; What: String):Integer;
var
  bufBuffer, bufBuffer2: array[0..254] of Char;
  i: Integer;
begin
filter.Form2.ListBox1.Items.Add('finding');
  What := 'train';
  Result := 0;
  i := 0;
  FillChar(bufBuffer, 255, #0);          
  FillChar(bufBuffer2, 255, #0);       
  StrPCopy(@bufBuffer2, What);           
  Stream.Position:=0;
  while Stream.Position <> Stream.Size do   
  begin
    Stream.Read(bufBuffer[0],Length(What));   
    if CompareMem(@bufBuffer,@bufBuffer2,Length(What)) then       
    begin
    filter.Form2.ListBox1.Items.Add(IntToStr(Stream.Position-Length(What)));
      Result := Stream.Position-Length(What);  // not 0 : it's found keyphrase
      Exit;
    end;
    i := i + 1;
  //  filter.Form2.ListBox1.Items.Add(IntToStr(i));
    Stream.Seek(i,0)     
  end;
end;

【问题讨论】:

  • 你说的关键字是什么?那是响应标头的一部分还是内容?你能在你的问题中描述更多吗?
  • 只是html中的某个关键字;一个搜索词。例如“银行”。
  • 好吧,那么您可以将内容视为 HTML 文档,例如通过 MSHTML 对其进行解析,并检查该关键字是否是某个 HTML 标记的值(如果是的话)。这就是您对该内容所能做的一切(但即使这样也比仅检查该字符串是否是您收到的内容的一部分要安全得多)。
  • 好的,非常感谢。您知道从 http 服务器解析的任何教程/示例吗?谢谢
  • 比较文本时,您应该确保流和缓冲区都具有相同的文本编码(即相同的字节表示)。您假设您的流包含 UTF16LE 字节,但内容可能采用 UTF8、Windows-1251 等格式,因此即使“匹配”在视觉上存在,您也无法找到匹配项。

标签: delphi pascal indy delphi-xe3 indy10


【解决方案1】:

有些库可用于 HTML 解析,例如(商业)DIHtmlParser

DIHtmlParser 从 HTML、XHTML 和 XML 读取、提取和写入信息。

从它的功能列表中:

  • 完整的 Unicode 支持(UnicodeString 或 WideString,取决于 Delphi 版本)。
  • 本机读取和写入超过 70 个字符集(独立于操作系统)。
  • 在 TStream、内存缓冲区或字符串上运行。
  • 一次将一段 HTML 返回给应用程序。

有了这样的库,可以很容易地从 HTML 响应中提取 HTML 内容(可见文本),而查找搜索词的剩余任务将变得微不足道。

我不会尝试编写自己的 HTML 解析器,而是使用现有的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2014-07-27
    • 2013-11-01
    相关资源
    最近更新 更多