保留整个表单标签的内容 html

keep content of form tag from whole html

我正在使用 Zend Framework2 并尝试从整个 HTML.

中过滤 <form> 标签的内容

I'm scrapping the page from different site and the page loads after some time and huge full page loader is there.

我尝试过 DomDocumentphpQuery 但没有成功。

这是 DomDocument

$htmlForm = new \DOMDocument();
$htmlForm->loadHTML($formData);
$onlyForm = $htmlForm->getElementById('#Frmswift');
echo $htmlForm->saveHTML($onlyForm);

这是 phpQuery

$doc = phpQuery::newDocument($formData);
$doc->find('#Frmswift')->parent()->siblings()->remove();
echo pq($doc)->html();

我哪里错了?

如果我很好理解的话,有一个网站可以在 DOM 事件或其他方式上动态加载 HTML 表单。如果是这样,那么您将无法在 PHP 中抓取此表单,除非您知道网站动态加载表单时触发的 url。
检查 Chrome 的 dev tool -> network 并查看已发出的 XHR 请求。

DOMDocument::loadHTML() 加载 "raw" DOM 对象 - 不被 JavaScript 代码操作,所以你不能使用 getElementById('#Frmswift') 因为这个元素不存在还。
PHP 用于网络抓取不是一个好的选择。我建议您在 Node.js 或使用 Phantom.js.

中执行此操作

编辑

好的,查看 this YouTube 视频。很好地解释了如何使用 chrome 的开发人员工具,特别是 Network 选项卡(这与 Firefox 非常相似)。因此,请访问包含您问题中 <form> 的网站 -> 右键单击​​并检查元素,然后:

  1. 当您在 网络 选项卡上时,您可以过滤列表以仅查看 XHR 请求

  2. 浏览请求列表并在 Response 子选项卡中检查每个请求的结果(在视频中位于右下方屏幕)。您应该找到来自哪个请求的此表单的 HTML

  3. 然后如果你成功找到这个 - 你知道表单来自哪里,select 这个请求在开发者工具控制台(我们在 Network 选项卡)然后再次在右下角转到 Headers 子选项卡。

  4. 复制请求URL - 这是表单HTML的来源

  5. 检查请求方法

    5.1。如果是 GET 则使用 PHP 的 $htmlForm = file_get_contents(URL from point 4); 并在替换时继续 ORIGINAL POST $sampleHtml$htmlForm.

    5.2。如果是 POST 请参考此 link or google search or this Whosebug 答案并再次使用结果继续 ORIGINAL POST

原版POST

你好_伙伴。

我发现您的代码片段中有一个错误 - 使用 getElementById

时您不需要 #

检查以下代码片段,让我知道它是否对您有帮助(详情请参阅评论):

$sampleHtml = ' 
    <!DOCTYPE html>
    <html>
    <head>
        <title>External Page Content</title>
    </head>
    <body>
        <h1>Some header</h1>
        <p>Some lorem text ....</p>
        <form id="Frmswift">
            <input name="input1" type="text">
            <input name="input2" type="text">
            <textarea name="mytextarea"></textarea>
        </form>
    </body>
    </html>';

$dom = new \DOMDocument();
$dom->loadHTML($sampleHtml);

// Where you use getElementById do not put # in front of the selector 
// This method is working analogically to javascript's getElementById()
$form = $dom->getElementById('Frmswift');

// Use second blank document which with hold
// the previously selected form
$blankDoc = new \DOMDocument();
$blankDoc->appendChild($blankDoc->importNode($form, true));

// using htmlspecialchars just to show the code, 
// otherwise you will see imputs in the browser - this is just 
// for the testing purpose. I suppose you will need the $blankDoc
// which is holding only the form
echo htmlspecialchars($blankDoc->saveHTML());
exit;

输出:

<form id="Frmswift"> 
    <input name="input1" type="text">
    <input name="input2" type="text">
    <textarea name="mytextarea"></textarea>
</form>