php:从网页中提取特定标签之间的文本


php: Extract text between specific tags from a webpage

可能重复:
用PHP 解析HTML的最佳方法

我知道我应该使用像php-domdocument这样的html解析器(http://docs.php.net/manual/en/domdocument.loadhtml.php)或汤。

如何使用php-domdocument提取特定标记之间的文本,例如获取h1、h2、h3、p、table之间的文本?似乎我只能用getelementbytagname对一个标记执行此操作。

对于这样的任务,有更好的html解析器吗?或者我该如何循环浏览php-domdocument?

你是对的,使用DomDocument(因为regex不是解析HTML的好主意。为什么?请参阅此处和此处了解原因(。

getElementsByTagName为您提供了一个DOMNodeList,您可以对其进行迭代以获得所有找到的元素的文本。所以,你的代码可能看起来像:

$document = new 'DOMDocument();
$document->loadHTML($html);
$tags = array ('h1', 'h2', 'h3', 'h4', 'p');
$texts = array ();
foreach($tags as $tag)
{
  $elementList = $document->getElementsByTagName($tag);
  foreach($elementList as $element)
  {
     $texts[$element->tagName][] = $element->textContent;
  }
}
return $texts;

请注意,您可能会在其中进行一些错误处理,并且还会丢失文本的上下文,但您可能会根据需要编辑此代码。

您可以使用正则表达式来执行此操作。

preg_match_all('#<h1>([^<]*)</h1>#Usi', $html_string, $matches);
foreach ($matches as $match)
{
  // do something with $match
}

我不确定你的来源是什么,所以我添加了一个函数来通过URL获取内容。

$file = file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHTML($file);
$body = $doc->getElementsByTagName('body');
$h1 = $body->getElementsByTagName('h1');

我不确定这部分:

for ($i = 0; $i < $items->length; $i++) {
    echo $items->item($i)->nodeValue . "'n";
}

或者:

foreach ($items as $item) {
    echo $item->nodeValue . "'n";
}

以下是有关nodeValue的更多信息:http://docs.php.net/manual/en/function.domnode-node-value.php

希望它能有所帮助!