在安卓Firefox应用程序和safari iPad中,我们可以通过"阅读器模式"只读取主要内容。阅读更多。。。如何用PHP只识别HTML中的主要内容?
我需要通过php检测像Firefox或safari这样的主要新闻
例如,我通过以下代码从bbcsite.com/news/123
获得新闻:
<?php
$html = file_get_contents('http://bbcsite.com/news/123');
?>
然后只显示没有广告的主要新闻。。。比如Firefox和safari。
我找到fivefilters.org。这个网站可以获取内容!!!
感谢
一个名为PHP Goose的新PHP库似乎也在这方面做得很好。它很容易使用,而且对作曲家很友好。
以下是实际自述文件中给出的用法示例:
use GooseClient as GooseClient;
$goose = new GooseClient();
$article = $goose->extractContent('http://url.to/article');
$title = $article->getTitle();
$metaDescription = $article->getMetaDescription();
$metaKeywords = $article->getMetaKeywords();
$canonicalLink = $article->getCanonicalLink();
$domain = $article->getDomain();
$tags = $article->getTags();
$links = $article->getLinks();
$movies = $article->getMovies();
$articleText = $article->getCleanedArticleText();
$entities = $article->getPopularWords();
$image = $article->getTopImage();
$allImages = $article->getAllImages();
Readability.php工作得很好,但我发现,如果你对html内容进行卷曲并欺骗用户代理,你会得到更成功的结果。你也可以使用一些重定向转发,以防你试图点击的url给你带来绕过。以下是我现在使用的从另一篇文章中稍微修改过的内容(PHP Curl遵循重定向)。希望你觉得它有用。
function getData($url) {
$url = str_replace('&', '&', urldecode(trim($url)) );
$timeout = 5;
$cookie = tempnam('/tmp', 'CURLCOOKIE');
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
$content = curl_exec($ch);
curl_close ($ch);
return $content;
}
实施:
$url = 'http://';
//$html = file_get_contents($url);
$html = getData($url);
if (function_exists('tidy_parse_string')) {
$tidy = tidy_parse_string($html, array(), 'UTF8');
$tidy->cleanRepair();
$html = $tidy->value;
}
$readability = new Readability($html, $url);
//...
PHP中没有这样的内置函数。恐怕我将不得不自己解析和分析HTML文档。您可能需要使用一些XML解析器,SimpleXML库是一个很好的候选者。
我不熟悉您所指的"阅读器模式"功能,但一个好的起点可能是删除所有<img>
内容。它使用的实际"清理"算法当然一点也不琐碎,而且它似乎实际上是作为对Javascript中的第三方封闭源服务的调用来实现的。
万岁!!!
我发现了这个源代码:
1) 创建Readability.php
2) 创建JSLikeHTMLElement.php
3) 通过以下代码创建index.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>!</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body dir="rtl">
<?php
include_once 'Readability.php';
// get latest Medialens alert
// (change this URL to whatever you'd like to test)
$url = 'http://';
$html = file_get_contents($url);
// Note: PHP Readability expects UTF-8 encoded content.
// If your content is not UTF-8 encoded, convert it
// first before passing it to PHP Readability.
// Both iconv() and mb_convert_encoding() can do this.
// If we've got Tidy, let's clean up input.
// This step is highly recommended - PHP's default HTML parser
// often doesn't do a great job and results in strange output.
if (function_exists('tidy_parse_string')) {
$tidy = tidy_parse_string($html, array(), 'UTF8');
$tidy->cleanRepair();
$html = $tidy->value;
}
// give it to Readability
$readability = new Readability($html, $url);
// print debug output?
// useful to compare against Arc90's original JS version -
// simply click the bookmarklet with FireBug's console window open
$readability->debug = false;
// convert links to footnotes?
$readability->convertLinksToFootnotes = true;
// process it
$result = $readability->init();
// does it look like we found what we wanted?
if ($result) {
echo "== Title =====================================n";
echo $readability->getTitle()->textContent, "nn";
echo "== Body ======================================n";
$content = $readability->getContent()->innerHTML;
// if we've got Tidy, let's clean it up for output
if (function_exists('tidy_parse_string')) {
$tidy = tidy_parse_string($content, array('indent'=>true, 'show-body-only' => true), 'UTF8');
$tidy->cleanRepair();
$content = $tidy->value;
}
echo $content;
} else {
echo 'Looks like we couldn't find the content. :(';
}
?>
</body>
</html>
在$url = 'http://';
中设置您的网站url。
谢谢;)
这是为了显示整个内容,如果你想了解更多信息,只需在谷歌中搜索正则表达式,以及如何在html文件中的标签之间获取值,我会用演示告诉你为什么:)
首先,当你使用函数文件获取内容时,你会得到带有html代码的文件,但服务器或浏览器会像页面一样显示这个代码,
$html = file_get_contents('http://coder-dz.com');
preg_match_all('/<li>(.*?)</li>/s', $html, $matches);
foreach($matches[1] as $mytitle)
{
echo $mytitle."<br/>";
}
我在这里做了什么?我得到我的网站的内容是word press我得到标题,因为标题它们在HTML li的标签中,之后我使用正则表达式来获得这些标签之间的值。
我希望你明白我的意思,因为我不懂英语,如果你有任何问题,请随时问我