保留整个表单标签的内容 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.
我尝试过 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();
我哪里错了?
如果我很好理解的话,有一个网站可以在 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>
的网站 -> 右键单击并检查元素,然后:
当您在 网络 选项卡上时,您可以过滤列表以仅查看 XHR 请求
浏览请求列表并在 Response 子选项卡中检查每个请求的结果(在视频中位于右下方屏幕)。您应该找到来自哪个请求的此表单的 HTML
。
然后如果你成功找到这个 - 你知道表单来自哪里,select 这个请求在开发者工具控制台(我们在 Network 选项卡)然后再次在右下角转到 Headers 子选项卡。
复制请求URL - 这是表单HTML的来源
检查请求方法
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>
我正在使用 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.
我尝试过 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();
我哪里错了?
如果我很好理解的话,有一个网站可以在 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>
的网站 -> 右键单击并检查元素,然后:
当您在 网络 选项卡上时,您可以过滤列表以仅查看 XHR 请求
浏览请求列表并在 Response 子选项卡中检查每个请求的结果(在视频中位于右下方屏幕)。您应该找到来自哪个请求的此表单的
HTML
。然后如果你成功找到这个 - 你知道表单来自哪里,select 这个请求在开发者工具控制台(我们在 Network 选项卡)然后再次在右下角转到 Headers 子选项卡。
复制请求URL - 这是表单HTML的来源
检查请求方法
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>