我正在使用Zend Framework2并尝试从整个HTML中过滤<form>
标记的内容。
我正在从不同的网站上删除页面,一段时间后页面加载,并且有大量的整页加载器。
我尝试使用DomDocument
和phpQuery
但未获得成功。
这是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();
我哪里错了?
答案 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;右键单击并检查元素,然后:
当您使用网络标签时,您可以过滤列表以仅查看 XHR 请求
浏览请求列表并在响应子标签中检查每个请求的结果(视频位于屏幕的右下角)。您应该从哪个请求中找到此表单的HTML
。
然后,如果您成功找到了 - 您知道表单的来源,请在开发人员工具控制台中选择此请求(我们现在位于网络标签上),然后再次在底部 - 转到标题子标签。
复制请求网址 - 这是HTML表单的来源
检查请求方法
5.1。如果是 GET ,则在使用$htmlForm = file_get_contents(URL from point 4);
替换$sampleHtml
时,使用PHP $htmlForm
并继续原始发布。
5.2。如果是 POST ,请参阅此link或google search或this stackoverflow应答,然后再次使用结果原始发布 < / p>
原始帖子
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>