在Delphi中使用TIdHTTP提交表单并检索数据(不常见)

use*_*752 1 html delphi indy

存在一个网页(www.someurl.co.uk),其中除其他外,其内部还具有包含输入字段和图像的表单。

在浏览器中,当用户在输入字段中输入字符串并单击图像时,将提交表单并生成另一个页面(www.someurl.co.uk/results.php),该页面除其他外还包含一个表,该表包含一些结果。

我需要Delphi在第一页的表单中填写字符串,提交表单,然后从结果页上的表格中获取几个单元格的内容。

我已经使用TIdHTTP组件使用以下代码将数据发布到表单,但是之后在备注框中看到的文本只是初始页面(www.someurl.co.uk)的html。

请有人用正确的代码帮助我,以从结果页面获取值BlaBla_A,BlaBla_C,BlaBla_C和BlaBla_D-并了解哪个是哪个?

(尽管我对Delphi感到满意,但是我对网页和HTML并不了解很多,这是我第一次使用Indy组件)

这是我目前正在使用的代码

procedure TForm1.Button2Click(Sender: TObject);
var
  Response: TStringStream;
  Params: TStringList;
begin
Params := TStringList.Create;
try
  Params.Add('thedata=' + 'MyString');
  Response := TStringStream.Create('');
  try
     IdHTTP1.Post('www.someurl.co.uk', Params, Response);
     memo1.Text := Response.DataString;
  except
   on E: Exception do
   begin
    showmessage('Error: ' + E.Message);
   end;
  end;

finally
  Params.Free;
  Response.Free;
end;

end;
Run Code Online (Sandbox Code Playgroud)

数据输入/提交页面(www.someurl.co.uk)的重要部分如下所示

</div>
<h3>Enter the data you want to look for then click FIND</h3>
<form action="results.php" method="post" name="form1" target="_parent" 
      id="form1" 
      onsubmit="if (document.getElementById('text').value==''  
                   || document.getElementById('text').value=='ENTER DATA') 
                   {alert ('Please enter data first then click FIND'); 
                   return false;} 
            else 
               return true;">

<input name="thedata" type="text" id="text" value="ENTER DATA" 
       onclick="effectClear(this.id);this.value = '';" 
       class="validate[required]"/>

<input type="image" src="../images/find.png" name="image" id="homebutton" />
</form>
</div>  
Run Code Online (Sandbox Code Playgroud)

结果页面的重要部分(www.someurl.co.uk/results.php)看起来像这样

<div id="results_details">
    <table id="results_details_table" border="0">
        <tr>
          <td class="result_general"><h2>Here are your results</h2><br/></td>
          <td class="result_info">
              <label>Result_A</label><br/>BlaBla_A<br/>
              <label>Result_B</label><br/>BlaBla_B<br/>
          </td>
          <td class="result_info">
              <label>Result_C</label><br/>BlaBla_C<br/><br/>
              <label>Result_D</label><br/>BlaBla_D<br/><br/>
          </td>
        </tr>
        </table>
</div>
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

您正在将数据发布到此URL,这是错误的:

IdHTTP1.Post('www.someurl.co.uk', Params, Response);
Run Code Online (Sandbox Code Playgroud)

这就是为什么您要重新返回初始页面的原因-这实际上是您要的!

您需要发布到此URL:

IdHTTP1.Post('http://www.someurl.co.uk/results.php', Params, Response);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您根本不需要TStringStream,Post()可以为您返回字符串数据:

procedure TForm1.Button2Click(Sender: TObject);
var
  Params: TStringList;
begin
  Params := TStringList.Create;
  try
    Params.Add('thedata=' + 'MyString');
    try
      memo1.Text := IdHTTP1.Post('www.someurl.co.uk', Params);
    except
      on E: Exception do
      begin
        ShowMessage('Error: ' + E.Message);
      end;
    end;
  finally
    Params.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)