如何仅选择DOM文档中页面的文本

时间:2015-01-14 16:54:30

标签: php html dom

我想解析不同的网页,以便我可以形成倒排索引。我想只阅读文本,而不是标签元素,菜单等。是否可以这样做?以下是我到目前为止的情况:

 <?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>";
 } ?>

2 个答案:

答案 0 :(得分:0)

您可以使用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"

答案 1 :(得分:0)

我会这样做:

<?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
  "

如果要标准化空格(用一个空格替换2个或更多空格的所有序列并删除前导和尾随空格),则可以执行以下操作:

var_dump(preg_replace('/\s{2,}/', ' ', trim(
                $dom->getElementsByTagName("body")[0]->textContent)));