如何从表单上的隐藏字段中提取值

时间:2009-09-08 17:08:42

标签: php curl libcurl screen-scraping

我有形式(在我自己的博客/ cms安装,我想要玩一点)与我想要提取的隐藏值。问题是该页面上有两个表单,每个表单都带有值的隐藏字段。在每个表单上,字段名称相同,只有隐藏值不同。像这样:

<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

在html源代码中看起来都一样。所以,为了帮助自己我用这个页面打开php文件,编辑它并在我需要的字段之前添加一些随机单词。所以现在一个字段(我不想想要的字段)就像上面的代码一样,但我需要的字段是这样的:

mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

我如何从我需要的字段中提取值(在代码之前使用mywordshere)如果我的页面的html源代码在php变量中(用libcurl抓取)?

4 个答案:

答案 0 :(得分:2)

使用DOMDocument

的示例
<?php

$html = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
  <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere">
</body>
</html>
HTML;

$doc = new DOMDocument();
$doc->validateOnParse = true;
$doc->loadHTML( $html );

$node = $doc->getElementById( '_hiddenname' );
echo $node->getAttribute( 'value' );

?>

注意:您的HTML字符串必须已定义DOCTYPE才能生效。

答案 1 :(得分:1)

该值将在$_GET["_hiddenname"]$_POST["_hiddenname"]中提供,具体取决于您使用的方法。你得到哪一个将取决于提交的形式。

如果您有两个字段在中以相同的形式命名为相同的,则会出现更大的问题。

答案 2 :(得分:1)

可能这两种形式有不同的名称,对吗?因此,如果您使用DOM识别的东西解析已删除的文本,您应该能够通过在其父表单中搜索输入字段来选择输入字段。

答案 3 :(得分:0)

事实上,您有两个名为相同且具有相同ID的输入字段是真正的问题。 HTML元素的id属性在给定页面上应该是唯一的,如果是,您可以使用DOM parser轻松完成此操作。例如:

$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$inputs = $dom->getElementsByTagName('input');
foreach ($inputs as $i)
{
    if ($i->getAttribute('id') == 'targetId') {
        //do some stuff
    }
} 

由于你不能采用这种方法,并且你用一个你可以识别的字符串标记了你的输入,我会使用字符串函数的组合:

$str = 'mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>';
$pos = strpos($str,'mywordshere');
if ($pos !== false) {
    $valuePos = strpos($str,'value=',$pos);
    if ($valuePos !== false) {
        //get text starting from the 'value=' portion of the string
        $str = substr($str,$valuePos);
        $arr = explode('"',$str);
        //value will be in $arr[1]
        echo $arr[1];
    }
}

我强烈建议您重新使用元素ID,并使用DOM方法。