我目前正在抓取一个网站并获取所需的所有有用数据,虽然它带有一些我不想要的数据。不带标签的带状图标
例子:
<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>
所以基本上我想要删除而不被任何h2
或p
标记之间的所有文本。
有没有简单的函数/ preg?
我目前正在抓取一个网站并获取所需的所有有用数据,虽然它带有一些我不想要的数据。不带标签的带状图标
例子:
<h2>Heading</h2>
<p>Useful <a href="/foo">data</a></p>
Rubbish <a href="/bar">data</a>
<h2>heading</h2>
所以基本上我想要删除而不被任何h2
或p
标记之间的所有文本。
有没有简单的函数/ preg?
结果是小有一点好:
preg_match_all('~<h2>.*?<\/h2>|<p>.*?<\/p>~i', $str, $new);
最懒的解决方案将使用phpQuery或QueryPath只:
foreach (qp($html)->find("body *") as $node) {
echo $node->html(), "\n";
}
它遍历下面身上所有的标签,并隐含跳过文本节点。所以你只需要收集结果 - > html()片段。
最好的方法是使用PHP的DOMDocument类。这与mario's answer非常相似,只是它不需要一个全新的库。
$doc = new DOMDocument;
$doc->loadXML('<root>' . $yourContent . '</root>');
$nodes = $doc->firstChild->childNodes;
$output = '';
for ($i = 0; $i < $nodes->length; $i++) {
$node = $nodes->item($i);
if ($node->nodeType !== XML_TEXT_NODE) {
$output .= $doc->saveXML($node);
}
}
echo $output;
*(相关)* [最佳方法来解析HTML(http://stackoverflow.com/questions/3577641/best-methods-to-parse -html/3577662#3577662) – Gordon 2011-02-14 22:57:33
您正在使用哪个类来解析HTML? – Eray 2011-02-14 22:58:50
它是一个快速和肮脏的preg到这一点。 (一个快速和肮脏的黑客项目)。可以使用htmlpurifier,但宁可不,如果我可以帮助它。 – bluedaniel 2011-02-14 23:01:00