1

我想使用 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;
?>

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


然后我尝试回显加载的 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;
?>

现在我得到:

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


我还尝试通过 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: 实体中没有名称,第 37 行 /home/a1234bc/public_html/simple_html_dom.php 中的第 166 行

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

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

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

警告:DOMDocument::loadHTML() [domdocument.loadhtml]:标签 fb:login-button 在实体中无效,第 37 行 /home/a1234bc/public_html/simple_html_dom.php 中的第 256 行

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

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

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

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

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

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

4

2 回答 2

0

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

// 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->find工作得很好!

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

希望这可以帮助!

于 2013-02-14T11:50:00.470 回答
-1

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

于 2012-09-25T11:31:38.270 回答