使用PHP从网页中提取特定标签之间的文本

3

可能与此内容重复:
使用 PHP 解析 HTML 的最佳方法

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

我如何使用php domdocument提取特定标签之间的文本,例如获取h1、h2、h3、p、table之间的文本?似乎我只能使用getelementbytagname来做到这一点,而且只能针对一个标签。

是否有更好的html解析器可以完成这个任务?或者我应该如何遍历php domdocument?

3个回答

7
您是正确的,应使用DomDocument(因为正则表达式不适用于解析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;

请注意,您可能需要一些错误处理,并且您还将失去文本的上下文,但是您可以根据需要编辑此代码。

谢谢,看起来不错。我在一些网页上尝试了一下,比如yahoo.com(只是添加了 $html = file_get_contents("http://yahoo.com");),但总是失败并给出可怕的 domdocument.loadhtml</a>]: htmlParseEntityRef: expecting ';' in Entity 我想我得去检查tagsoup或simplehtmldom了。:) 算法看起来不错。 - giorgio79

0

你可以使用正则表达式来实现。

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

1
请勿使用正则表达式来解析此内容!正则表达式在解析HTML时不可靠。 - GordonM

0

我不确定你的来源是什么,所以我添加了一个函数通过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

希望能对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接