我有以下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';
加载完文件后的在我看来是多余的。也许您应该删除它,以减少代码,以便更容易找到错误的来源(就像我在演示中所做的那样)。