从整个html中保留表单标记的内容

时间:2017-03-01 11:45:24

标签: php html zend-framework2 domdocument phpquery

我正在使用Zend Framework2并尝试从整个HTML中过滤<form>标记的内容。

  

我正在从不同的网站上删除页面,一段时间后页面加载,并且有大量的整页加载器。

我尝试使用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();

我哪里错了?

2 个答案:

答案 0 :(得分:2)

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

DOMDocument::loadHTML()加载“原始”DOM对象 - 不受JavaScript代码操纵,因此您无法使用getElementById('#Frmswift'),因为此元素尚不存在。
用于网页抓取的PHP不是一个好选择。我建议你在Node.js或使用Phantom.js。

答案 1 :(得分:1)

修改

好的,请查看this YouTube视频。很好地解释了如何使用chrome的开发人员工具,特别是网络标签(这在Firefox中非常类似)。所以,请从您的问题中抓住<form>的网站 - &gt;右键单击并检查元素,然后:

  1. 当您使用网络标签时,您可以过滤列表以仅查看 XHR 请求

  2. 浏览请求列表并在响应子标签中检查每个请求的结果(视频位于屏幕的右下角)。您应该从哪个请求中找到此表单的HTML

  3. 然后,如果您成功找到了 - 您知道表单的来源,请在开发人员工具控制台中选择此请求(我们现在位于网络标签上),然后再次在底部 - 转到标题子标签。

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

  5. 检查请求方法

    5.1。如果是 GET ,则在使用$htmlForm = file_get_contents(URL from point 4);替换$sampleHtml时,使用PHP $htmlForm并继续原始发布

    5.2。如果是 POST ,请参阅此linkgoogle searchthis stackoverflow应答,然后再次使用结果原始发布 < / p>

  6. 原始帖子

    Hello_ mate。

    我在您的代码段中发现错误 - 使用#

    时您不需要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>