简单的HTML DOM解析器 - 跳过某些元素

时间:2011-04-08 13:27:35

标签: php web-scraping

我正在使用Simple HTML DOM Parser,我想完全忽略“嵌套”元素的内容,并获取正在进行的“pre”元素的内容。

<div id=parent>

<div class="nested">
<pre>Text that I want ignored</pre>
</div>

<pre>
This is the text I want to access
</pre>
</div>

我无法控制HTML源代码,并且所有者最近添加了“嵌套”元素。在我访问我需要的内容之前:

$page_contents = file_get_html($url);    
$div_content = $page_contents->find('div[id=parent]pre', 0)->innertext;

但很明显,新的嵌套元素已经破坏了我的方法。

我似乎无法找到有关此类情况的任何官方文档。

2 个答案:

答案 0 :(得分:3)

未经测试但请尝试此

$div_content = $page_contents->find('div[id=parent][class!=nested]pre', 0)->innertext;

$div_content = $page_contents->find('div[id=parent class!=nested]pre', 0)->innertext;

或者甚至可能只是这个我认为这是真的那个,但我还没有测试过

$div_content = $page_contents->find('div[class!=nested]pre', 1)->innertext;

仍然不知道这是否有效但是试试这个

$div_content = $page_contents->find('div[class!=nested pre]', 0)->innertext;

$div_content = $page_contents->find('div[class!=nested pre]', 0)->plaintext;

答案 1 :(得分:0)

find('div[id=parent] pre')会在指定的pre中找到所有div个标签,如果其中一个标记包含在另一个div中,则不在乎,所以还有一些建议:

如果您确切地知道要获得哪个pre,只需指定从零开始的数字,在您的情况下:

$div_content = $page_contents->find('div[id=parent] pre', 1)->innertext;

如果您不知道有多少pre,或者不知道订单,您可以删除您不想要的那个,然后执行上一行,但这次指定数字0:

$page_contents->find('div[id=parent] div[id=nested] pre', 0)->outertext = '';
$div_content = $page_contents->find('div[id=parent] pre', 0)->innertext;

如果您不想更改$page_contents,只需将您的父div分配给临时变量,并执行以上操作:

$temp = $page_contents->find('div[id=parent]', 0);
$temp->find('div[id=nested] pre', 0)->outertext='';
$div_content = $temp->find('pre', 0)->innertext;

当然还有很多其他方法可以做到这一点,应该阅读手册http://simplehtmldom.sourceforge.net/manual.htm虽然它只提到了主要功能,但更多的是在引擎盖下