【问题标题】:Load and Parse a portion of External HTML加载和解析外部 HTML 的一部分
【发布时间】:2012-09-16 21:53:03
【问题描述】:

我想使用 php 从外部网站提取(解析)部分 HTML 文档

例如:为了从 yahoo 中提取新闻,我尝试使用来自 sourceforge 的 SimpleHTML DOM Parser

<?php
$url="http://news.yahoo.com/einsteins-brain-now-interactive-ipad-app-071441969.html";
include('simple_html_dom.php');  
$html=new simple_html_dom();
$html->load_file($url);
$xxx=$html->find('title')->innertext; 
echo $xxx;
?>

致命错误:在非对象上调用成员函数 find() /home/a1234bc/public_html/simple_html_dom.php 在第 1113 行


然后我尝试回显加载的html

<?php
$url="http://news.yahoo.com/einsteins-brain-now-interactive-ipad-app-071441969.html";
include('simple_html_dom.php');  
$html=new simple_html_dom();
$html->load_file($url);
echo $html;
?>

现在我明白了:

致命错误:在非对象上调用成员函数 innertext() /home/a1234bc/public_html/simple_html_dom.php 在第 1688 行


我也尝试通过 file_get_contents() 使用 DOMDocument()

<?php
$url="http://news.yahoo.com/einsteins-brain-now-interactive-ipad-app-071441969.html";
$content = file_get_contents($url);
// echo $content works perfect

$doc = new DOMDocument();
$doc->loadHTML($content);
$jjj=$doc->getElementsByTagName('title')->item(0);
echo $jjj;
?>

这会引发一长串警告。所以让我单独复制粘贴前 10 个

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef:实体中没有名称,行:166 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:166 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef:实体中没有名称,行:256 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:256 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: 标记 fb:实体中的登录按钮无效,行:256 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:275 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:287 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:292 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 期待 ';'在实体中,行:311 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

警告:DOMDocument::loadHTML() [domdocument.loadhtml]: 属性 实体中重新定义的类,行:325 in /home/a1234bc/public_html/simple_html_dom.php 在第 37 行

有人可以指点我正确的方向吗?

【问题讨论】:

    标签: dom


    【解决方案1】:

    我在使用手册中的面向对象方式时遇到了同样的错误:

    // Create a DOM object
    $html = new simple_html_dom();
    
    // Load HTML from a string
    $html->load('<html><body>Hello!</body></html>');
    
    // Load HTML from a URL 
    $html->load_file('http://www.google.com/');
    
    // Load HTML from a HTML file 
    $html->load_file('test.htm');
    

    当我切换到手册中所示的快速方式时,摆脱了错误并让我的脚本正常工作:

    // Create a DOM object from a string
    $html = str_get_html('<html><body>Hello!</body></html>');
    
    // Create a DOM object from a URL
    $html = file_get_html('http://www.google.com/');
    
    // Create a DOM object from a HTML file
    $html = file_get_html('test.htm');
    

    在这之后$html-&gt;find 工作得很好!

    PHP Simple HTML DOM Parser 手册可以在这里找到:http://simplehtmldom.sourceforge.net/manual.htm

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      DOMDocument/SimpleXML 是为解析 XML 而不是 HTML 而设计的。您需要使用 file_get_contents 将 HTML 转换为字符串,然后使用字符串操作函数来获取您需要的部分。 preg_match_all 将是一个不错的起点。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2020-07-27
      • 2019-08-11
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多