2

在 android 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。本站可以获取内容!!!

谢谢你

4

5 回答 5

4

一个名为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();
于 2015-09-03T19:05:57.190 回答
2

Readability.php 工作得很好,但我发现如果你为 html 内容卷曲并欺骗用户代理,你会得到更成功的结果。您还可以使用一些重定向转发,以防您尝试访问的 url 给您带来麻烦。这是我现在使用的内容,从另一篇文章(重定向后的 PHP Curl)稍作修改。希望你觉得它有用。

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);

//...
于 2014-02-15T06:46:02.663 回答
1

PHP 中没有这样的内置函数。恐怕必须自己解析和分析 HTML 文档。您可能需要使用一些 XML 解析器,SimpleXML库是一个不错的选择。

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

于 2013-07-18T20:51:32.850 回答
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://';设置您的网站网址。

谢谢;)

于 2013-07-18T22:48:19.403 回答
0

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

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

于 2013-07-18T20:44:44.603 回答