PHP - 如何在Firefox中获取像Reader Mode这样的主要HTML内容

时间:2013-07-18 20:29:23

标签: php file-get-contents html-content-extraction

在Android Firefox应用程序和Safari iPad中,我们只能通过“阅读器模式”阅读主要内容。 read more... 如何用PHP识别HTML中的主要内容?

我需要通过php

检测主要新闻,如Firefox或safari

例如,我通过此代码从bbcsite.com/news/123获取新闻:

<?php
    $html = file_get_contents('http://bbcsite.com/news/123');
?>

然后只展示没有广告的主要新闻......比如Firefox和Safari。

我找到了fivefilters.org。这个网站可以获得内容!!!

谢谢

5 个答案:

答案 0 :(得分:3)

一个名为PHP Goose的新PHP库似乎在这方面做得非常好。它非常易于使用且Composer友好。

以下是实际自述文件中的使用示例:

use Goose\Client 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();

答案 1 :(得分:2)

Readability.php工作得很好,但是如果你卷曲html内容并欺骗用户代理,我发现你会得到更多成功的结果。如果您尝试访问的网址为您提供了解决方法,您还可以使用一些重定向转发功能。这是我现在使用的另一篇文章(PHP Curl following redirects)略有修改。希望你觉得它很有用。

function getData($url) {
    $url = str_replace('&amp;', '&', 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);

//...

答案 2 :(得分:1)

PHP中没有这样的内置函数。我担心自己必须解析和分析HTML文档。您可能需要使用一些XML解析器,SimpleXML库是一个很好的候选者。

我不熟悉您所指的“阅读器模式”功能,但一个好的起点可能是删除所有<img>内容。它使用的实际“清理”算法当然不是微不足道的,它似乎实际上是作为第三方的呼叫实现的,封闭的源,service in Javascript

答案 3 :(得分:1)

万岁!!!

我找到了这个源代码:

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, "\n\n";
    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://';设置您的网站网址。

谢谢;)

答案 4 :(得分:0)

这是显示整个内容,如果你想了解更多关于这一点的信息,只需在谷歌搜索关于正则表达式以及如何在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的标签之后我使用正则表达式来获取这些标签之间的值。

我希望你明白我的意思,因为我不是英语,如果你有任何问题随时可以问我