使用php DomDocument获取一个元素


get an element using php DomDocument

我有以下html,我使用php的DomDocument类获得id 'nextPageBtn'旁边的脚本标签的元素。问题是我的查询没有返回任何东西(好像没有具有指定id的元素)。这是我正在解析的HTML。

<body>
    <div style='float:left'><img src='../../../../includes/ph1.jpg'></div>
    <label style='width: 476px; height: 40px; position: absolute;top:100px; left: 40px; z-index: 2; background-color: rgb(255, 255, 255);; background-color: transparent' >
    <font size="4">1a. Nice to meet you!</font>
    </label>
    <img src='ENG_L1_C1_P0_1.jpg' style='width: 700px; height: 540px; position: absolute;top:140px; left: 40px; z-index: 1;' />
    <script type='text/javascript'> 

    swfobject.registerObject('FlashID');
    </script>
    <input type="image" id="nextPageBtn" src="../../../../includes/ph4.gif" style="position: absolute; top: 40px; left: 795px; ">
    </body>

,这里是解析它的PHP代码。

$doc->loadHTMLFile($path);
    $doc->encoding='UTF-8';
    $x = new DOMXPath($doc);
$nextPage=$x->query("//*[@id='nextPageBtn']")->item(0);
if($nextPage)
    {
    echo 'found it..';
}

我认为行'swfobject.registerObject(' flashd ')'正在生成某种错误,这是避免元素被发现?

正如注释中所写的那样,您的代码可以完美地工作。演示:http://codepad.viper - 7. - com/rungod

你认为问题的根源是什么:

我认为行'swfobject.registerObject(' flashd ')'正在生成某种错误,这是避免元素被发现?

几乎不能是一个,因为DOMDocument::loadHTMLFile应该处理所有标记(否则您将在加载文档时收到错误/警告)。加载完成后,DOMDocument已经标准化的数据可访问,所以没有这样的问题(如果没有libxml的错误,底层库,但几乎没有这样一个一般的事情)。

那么这里有什么选择呢?也许HTML并不是你想的那样。这可能是在加载HTML失败的情况下发生的。检查加载时的错误:

error_reporting(~0); ini_set('display_errors', 1);

还要验证HTML是加载后您认为的HTML:

$doc->loadHTMLFile($path);
echo $doc->saveHTML();

将输出"源"。

也检查你的LIBXML版本:

printf("LIBXML version: %s'n", LIBXML_DOTTED_VERSION);

LIBXML是PHP的DOMDocument所基于的底层库。根据不同的版本,可能会有错误,并不是所有的功能都能正常工作。例如,getElementById函数不能与2.6.26版本的loadHTMLFile/loadHTML一起工作,但可以与2.7.7版本一起工作(您使用的XPath表达式不受这两个版本的影响)。

如果您在这里遇到编码问题(源文件具有比预期的其他编码),则很难根据您提供的信息进行判断。内部DOMDocument的默认编码是UTF-8在PHP中,所以设置:

 $doc->encoding='UTF-8';
加载完文件后的

在我看来是多余的。也许您应该删除它,以减少代码,以便更容易找到错误的来源(就像我在演示中所做的那样)。