首页 > 解决方案 > 如何使用 php 从这样的 html 响应中选择元素?

问题描述

我只是在用 Facebook 做 curl 请求,如果我能解决这个问题,我就遇到了一个问题,我可以轻松地继续一切。

我的卷曲代码

function curl($url, $data=null, $ua=null, $cookie=null){
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    if($data != null){
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    if($cookie != null){
        curl_setopt($c, CURLOPT_COOKIE, $cookie);
    }
    if($ua != null){
        curl_setopt($c, CURLOPT_USERAGENT, $ua);
    }
    $hmm = curl_exec($c);
    curl_close($c);
    return $hmm;
}
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0';
$data = curl('https://facebook.com/', 0, $ua, 0,); //$data stores the html response of Facebook.com
print_r($data);

因此,从这段代码中,我们得到了 facebook.com 的 html 响应,我遇到的问题是从 html 响应中获取一些值,我需要获取值输入字段您可以在此处查看视图源:- view-source:https: //www.facebook.com 所以请帮我从第一个表单中获取输入字段的值(form id="login_form" action="https://www.facebook.com/login/device-based/regular/login /?login_attempt=1&lwv=111" method="post" novalidate="1" onsubmit="") 示例:- 我需要从这个字段中获取(input type="hidden" name="jazoest" value="2691" autocomplete="off" /) 名称和值,所以我需要回显 jazoest,2691 和其他像这样的输入字段我已经尝试过 preg_match 它没有按预期工作,我有一个 Dom 的例子做同样的事情

将此代码与 curl 功能一起使用

$ua = 'Mozilla/4.0 (compatible; MSIE 5.0; S60/3.0 NokiaN73-1/2.0(2.0617.0.0.7) Profile/MIDP-2.0 Configuration/CLDC-1.1)';
$data = curl('https://m.facebook.com/', 0, $ua, 0,); //$data stores the html response of Facebook.com
print_r($data);

这是 Facebook 的移动 web url 和这里使用的用户代理,在 Dom 的帮助下,我们可以使用下面的代码获取输入字段

function parse_inputs($html) {
    $dom = new DOMDocument;
    @$dom->loadxml($html);
    $inputs = $dom->getElementsByTagName('input');
    return($inputs);
}

$inputs = parse_inputs($data);
    $post_params = "";
    foreach ($inputs as $input) {
                $post_params .= $input->getAttribute('name') . '=' . urlencode($input->getAttribute('value')) . '&';
        }
print_r($post_params);

从这段代码中,我可以获得 m.facebook.com 的输入字段,但不能获得 www.facebook.com 的输入字段,请帮我解决这个问题,另一个有用的例子在这里请检查:- https://github.com/jerry- riady/Script-auto-like-face/blob/master/update.php 提前感谢所有答案。

标签: phphtmldom

解决方案


使用loadHTML而不是loadXML应该工作(在本地测试):

代替:

@$dom->loadxml($html);

和:

$dom->loadHTML($html);

此外,我建议使用以下行(在您的函数之外) ,而不是完全消除错误@(很少是一个好主意):parse_inputs

libxml_use_internal_errors(true);

这是一种更合适的静音错误输出的方法(它们仍然可以通过libxml_get_last_error()和/或libxml_get_errors()source)获得。


推荐阅读