是否可以使用 COM php 类和 IE 解析特定的 div 内容?

Is it possible to parse specific div content with COM php class and IE?

提问人:Mastas 提问时间:8/13/2023 最后编辑:Mastas 更新时间:8/13/2023 访问量:31

问:

所以问题出在标题上。我尝试使用 Internet Explorer 在服务器上呈现页面,然后在渲染后 - 从具有特定 Id(只是一个测试字符串)的 div 标签中抓取内容并将其显示在页面上。

但是我现在得到的只是 - IE 正在打开,然后脚本抛给我一个错误:

Fatal error: Uncaught com_exception: <b>Source:</b> Unknown<br/><b>Description:</b> Unknown in X:\server\code.php:11 Stack trace: #0 {main} thrown in X:\server\code.php on line 11

我的php代码是:

<?php
error_reporting(E_ALL);
$ie = new COM("InternetExplorer.Application");
$ie->Visible = true; // for debug
$handle = $ie->HWND;
$ie->Navigate2("http://testurl/test_page.html");
while ($ie->Busy) {
com_message_pump(4000);
}

$value1 = $ie->Document->body->getElementById("correct"); // <-- error is on that line!
print_r($value1);
$ie->Quit();
?>

我还尝试加载没有任何 js 脚本的空白页面,使用单个 123,但它也抛出了相同的错误,但在后台 IE 仍在加载 Ok 并显示页面。

我开始认为 $ie->Document-> 不要等待完全加载页面,因为完全加载所有 js 脚本并用信息填充 div 需要 15-20 秒,但是 $ie->Document-> 在脚本开始工作后 ~1 秒后抛出错误。有没有变体?

还试过这个:


$value1 = $ie->Document->innerhtml;

但一切都没有改变。我做错了什么?

使用 php 7.4 tbh.它与任何机器人都不相似,只需要来自服务器端的一些信息,这些信息只能通过旧的IE浏览器正确呈现。

更新

已尝试将代码更改为:

$ie = new COM("InternetExplorer.Application");
$ie->Visible = false; // for debug

$ie->Navigate("https://google.com");
   while ($ie->ReadyState != 4) {
       usleep(1000);
   }
$pageContent = $ie->Document->body->innerHTML;
print_r($pageContent);

现在错误更改为:

致命错误:未捕获com_exception:错误 [0x80010108] 被调用对象已与客户端断开连接。

javascript php html dom com

评论

1赞 ADyson 8/13/2023
如果你想从页面中获取一些特定的HTML,为什么不直接使用HTML/DOM解析器,如DOMDocument,或类似的东西呢?我不明白为什么您需要为不可靠的COM组件而烦恼。如果你只是用 cURL 请求页面,你会得到所有的 HTML(当然,除非页面包含一些加载内容的 Javascript)。
0赞 Mastas 8/13/2023
@ADyson此页面包含特定的 js 代码,该代码仅适用于特定版本的 IE,我需要它的完整结果。Curl/DOM 解析器不适用于 js 代码。
0赞 hakre 8/13/2023
IIRC 我的 IE 3/4/5 天和 COM,检查文档的就绪状态,这通常是一个时间问题。特别是当你在等待一些JS代码时,它可能比COM组件本身更不可靠,包装在try/catch中,并在一些时间内重试(usleep()可能是你的朋友,但要注意与Windows和各种PHP睡眠函数的差距)。
0赞 Mastas 8/13/2023
@hakre 更新了包含新信息的帖子。这个错误似乎有点奇怪。有什么想法可以解决它吗?..

答: 暂无答案