如何 select 仅 DOM 文档中某个页面的文本
How to select only the text from a pages in a DOM document
我想解析不同的网页,形成倒排索引。我只想阅读文本,而不是标签元素、菜单等。是否可以这样做?这是我目前所拥有的:
<?php
$ch = curl_init("http://en.wikipedia.org/wiki/Agile_software_development");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$c1 = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($c1);
$links = $dom->getElementsByTagName("body");
echo "<br>";
foreach($links as $links) {
$title = $links->getElementsBytagName("a");
$l= $title->length;
echo $link->nodeValue;
echo"<br>";
} ?>
您可以使用XPath 来提取它。
$html = <<<'HTML'
<html>
<head>
<title>TEST</title>
</head>
<body>
<h1>HEADER</h1>
<p>SOME CONTENT</p>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHtml($html);
$xpath = new DOMXPath($dom);
var_dump($xpath->evaluate('normalize-space(//body)'));
输出:
"HEADER SOME CONTENT"
我会这样做:
<?php
$html = <<<HTML
<html>
<head>
<title>TITLE</title>
</head>
<body>
<p>PARA 1</p>
<p>PARA <span>2</span></p>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHtml($html);
var_dump($dom->getElementsByTagName("body")[0]->textContent);
?>
textContent
字段按文档顺序为您提供节点本身 和 其后代的内容。上面的输出是:
string(25) "
PARA 1
PARA 2
"
如果你想规范化 spaces(将 2 个或更多 spaces 的所有序列替换为一个 space 并删除前导和尾随 space s), 那么你可以这样做:
var_dump(preg_replace('/\s{2,}/', ' ', trim(
$dom->getElementsByTagName("body")[0]->textContent)));
我想解析不同的网页,形成倒排索引。我只想阅读文本,而不是标签元素、菜单等。是否可以这样做?这是我目前所拥有的:
<?php
$ch = curl_init("http://en.wikipedia.org/wiki/Agile_software_development");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$c1 = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($c1);
$links = $dom->getElementsByTagName("body");
echo "<br>";
foreach($links as $links) {
$title = $links->getElementsBytagName("a");
$l= $title->length;
echo $link->nodeValue;
echo"<br>";
} ?>
您可以使用XPath 来提取它。
$html = <<<'HTML'
<html>
<head>
<title>TEST</title>
</head>
<body>
<h1>HEADER</h1>
<p>SOME CONTENT</p>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHtml($html);
$xpath = new DOMXPath($dom);
var_dump($xpath->evaluate('normalize-space(//body)'));
输出:
"HEADER SOME CONTENT"
我会这样做:
<?php
$html = <<<HTML
<html>
<head>
<title>TITLE</title>
</head>
<body>
<p>PARA 1</p>
<p>PARA <span>2</span></p>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHtml($html);
var_dump($dom->getElementsByTagName("body")[0]->textContent);
?>
textContent
字段按文档顺序为您提供节点本身 和 其后代的内容。上面的输出是:
string(25) "
PARA 1
PARA 2
"
如果你想规范化 spaces(将 2 个或更多 spaces 的所有序列替换为一个 space 并删除前导和尾随 space s), 那么你可以这样做:
var_dump(preg_replace('/\s{2,}/', ' ', trim(
$dom->getElementsByTagName("body")[0]->textContent)));