如何在PHP中从公开HTML页面提取与标题相关的特定正文文本?
网页正文提取与无关内容过滤方案
一、针对当前测试页面的快速改进方法
你当前的代码会抓取所有<p>标签,自然包含广告、侧边栏等无关内容。针对给定的测试页面,正文内容集中在class="entry-content"的容器内,只需先定位该容器再提取段落即可过滤大部分无关内容:
include('simple_html_dom.php'); $html = file_get_html("https://bengalmirrorthinkpositive.com/2023/01/05/vande-bharat-train-%E0%A4%AA%E0%A4%B0-%E0%A4%AC%E0%A4%82%E0%A4%97%E0%A4%BE%E0%A4%B2-%E0%A4%AE%E0%A5%87%E0%A4%82-%E0%A4%A8%E0%A4%B9%E0%A5%80%E0%A4%82-%E0%A4%B9%E0%A5%81%E0%A4%86/"); if($html){ // 定位正文所在的容器 $contentContainer = $html->find('.entry-content', 0); if($contentContainer){ foreach($contentContainer->find('p') as $element){ $text = trim($element->plaintext); // 过滤短文本(排除无关的小广告、提示语) if(strlen($text) > 20){ echo $text.'<br>'; } } } }
二、通用区分无关内容与主正文的策略
- 定位专属容器:绝大多数新闻、博客类网站会将正文放在固定标识的容器中,常见的class/id名称有
entry-content、post-body、article-content、main-content等,优先抓取这类容器内的内容。 - 过滤特征元素:广告、表单、侧边栏等无关内容通常带有特定的class(如
ad、widget、sidebar、form-wrap),可以通过排除这些容器内的元素来过滤。 - 文本长度筛选:正文段落一般有足够的长度,可设置阈值(如20-30字符),过滤掉过短的文本段落。
- 关键词匹配:提取页面标题的核心关键词,保留包含这些关键词的段落,进一步缩小范围。
三、更适用的PHP爬虫/正文提取库
- Readability PHP:基于Mozilla Readability算法开发,专门用于提取网页主内容,能自动识别并过滤广告、导航、表单等无关元素,无需手动定位容器,适配绝大多数网站。
- PHPQuery:语法类似jQuery,支持更灵活的DOM选择和过滤操作,适合需要精细控制元素提取的场景。
- Goutte:基于Symfony组件的爬虫库,支持Cookie管理、表单提交等复杂操作,结合CSS选择器可精准定位正文内容。
Readability PHP 使用示例
use Readability\Readability; require 'vendor/autoload.php'; $url = "https://bengalmirrorthinkpositive.com/2023/01/05/vande-bharat-train-%E0%A4%AA%E0%A4%B0-%E0%A4%AC%E0%A4%82%E0%A4%97%E0%A4%BE%E0%A4%B2-%E0%A4%AE%E0%A5%87%E0%A4%82-%E0%A4%A8%E0%A4%B9%E0%A5%80%E0%A4%82-%E0%A4%B9%E0%A5%81%E0%A4%86/"; $html = file_get_contents($url); $readability = new Readability($html, $url); if($readability->init()){ echo '标题:' . $readability->getTitle() . '<br>'; echo '正文:' . $readability->getContent(); } else { echo '正文提取失败'; }
内容的提问来源于stack exchange,提问作者user21048048
相关产品推荐
相关产品推荐

