【问题标题】:SimpleXML->xpath problemSimpleXML->xpath 问题
【发布时间】:2011-05-08 14:01:16
【问题描述】:

我正在尝试访问以下表格的每个行:

http://www.alliedelec.com/search/searchresults.aspx?N=0&Ntt=PIC16F648&Ntk=Primary&i=0&sw=n

使用 SimpleXML->xpath。我已将表的 xpath 确定为:

'//*[@id="tblParts"]'

现在我使用我的 cURL 字符串 $string 并执行以下操作:

$tidy->parseString($string);
$output = (string) $tidy;
$xml = new SimpleXMLElement($output);
$result = $xml->xpath('//*[@id="tblParts"]');
while(list( , $node) = each($result)) 
{
echo 'NODE:' . $node . "\n";
}

我得到的是诸如此类的错误,数以百计:

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 60: parser error : Opening and ending tag mismatch: meta line 22 and head in C:\xampp\htdocs\elexess\api\driver\driver_alliedelectronics.php on line 119

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: </head> in C:\xampp\htdocs\elexess\api\driver\driver_alliedelectronics.php on line 119

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in C:\xampp\htdocs\elexess\api\driver\driver_alliedelectronics.php on line 119

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 108: parser error : Opening and ending tag mismatch: img line 106 and td in C:\xampp\htdocs\elexess\api\driver\driver_alliedelectronics.php on line 119

最后还有这个:

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\xampp\htdocs\app\com\get\get_alliedelectronics.php:119 Stack trace: #0 C:\xampp\htdocs\app\com\get\get_alliedelectronics.php(119): SimpleXMLElement->__construct('<!DOCTYPE html ...') #1 C:\xampp\htdocs\app\com\get\get_alliedelectronics.php(95): get_Alliedelectronics->extractData('<!DOCTYPE html ...') #2 C:\xampp\htdocs\app\com\get\get_alliedelectronics.php(138): get_Alliedelectronics->query('PIC16F648') #3 {main} thrown in C:\xampp\htdocs\app\com\get\get_alliedelectronics.php on line 119

【问题讨论】:

    标签: php xml xpath curl simplexml


    【解决方案1】:

    看起来您正在获取并尝试解析的页面的 HTML 格式不正确(标签不匹配等)

    您可以尝试使用simplexml_import_dom 修复错误,正如我在this SO post 中解释的那样。

    【讨论】:

    • 此外,您需要使用适合您正在处理的数据的工具。如果您打算使用 XML 方法,那么编写好的代码要求您能够保证输入格式正确,而不仅仅是希望和通过实验猜测。您只能信任 XML 库为您生成 XML,因此如果您在处理的早期处于“脏”阶段,则必须使用 HTML 方法进行转换并确保代码安全。
    • 我不确定我可以使用哪些其他工具从这个 html 文件中提取数据,我也不确定如何清理脏代码,除非让它通过 tidy 运行。
    【解决方案2】:

    我建议不要使用 SimpleXML(@Nev Stokes 和 @Nicholas Wilson 是对的:这是 html,而不是 XML,你不能保证它会验证为 XML)并使用 DOM 之类的东西(参见 http://www.php.net/manual/en/book.dom.php) .您可以执行以下操作:

    $doc = new DOMDocument();
    $doc->loadHTML($string);
    $xpath = new DOMXPath($doc);
    $entries = $xpath->query('//*[@id="tblParts"]');
    foreach ($entries as $entry) {
      // do something
    }
    

    看看有没有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多