2014-12-02 90 views
2

有一个html:我如何获得特定类毕竟p标签在DOM

<p class="story-body__introduction">2013 yazındaki Gezi Parkı eylemlerinin başlarından itibaren çeşitli medya kurumları, gösterilerin arkasında Sırp gençlik örgütü Otpor'un olduğunu iddia etti.</p> 
<p>Geçtiğimiz günlerde ise, "Emniyet Genel Müdürlüğü Kaçakçılık ve Organize Suçlarla Mücadele Daire Başkanlığı'nın Gezi Parkı eylemlerinin devam ettiği 15 Haziran 2013'te İstanbul Organize Suçlarla Şube Müdürlüğü'ne gönderdiği yazıda eylemlerle ilgili Otpor'u işaret ettiği" bildirildi.</p> 
<p>Radikal.com.tr'de yer alan habere göre, "Bu yazı üzerine dönemin İstanbul Organize Suçlarla Şube Müdürü Nazmi Ardıç, İstanbul Cumhuriyet Başsavcılığı'na yazdığı yazıda ve Savcı Muammer Akkaş da İstanbul 1 No'lu Hakimliği'ne başvurarak çeşitli bilgiler istedi."</p> 
<p>Yazıda "Türkiye'de Otpor/Canvas örgütü tarafından bir halk hareketi geliştirilmeye çalışıldığı ve Otpor lideri İvan Maroviç'in birçok kişiyi bu yönde eğittiği" bildiriliyor.</p> 
<p>Maroviç'in bu kapsamda oyuncu Memet Ali Alabora'nın da aralarında bulunduğu isimlerle görüştüğü iddia ediliyor.</p> 
<p>Otpor, Sırbistan'da 1998 - 2004 yılları arasında faaliyet gösteren, dönemin lideri Slobodan Miloseviç'in devrilmesine neden olan sokak hareketlerinin önemli bileşenlerinden bir gençlik hareketi.</p> 

我的目标是:我想先class= "story-body__introduction"

代码后,把所有的p标签:

$storyBodyIntroduction = $html->find('p[class=story-body__introduction]', 0)->innertext(); 

如何获得其他<p>

+0

是的,很有可能,你也应该发布你的代码/尝试 – Ghost 2014-12-02 06:23:10

+0

你将需要JavaScript,而不是PHP。 – 2014-12-02 06:23:12

+0

但是这是可能的与dom。 – Nikul 2014-12-02 06:23:54

回答

2

是的,它很可能,你可以添加一个标志,它的发现之后,得到的<p> innertexts所有的休息:

$found = false; 
$text = array(); 
foreach($html->find('p') as $p) { 
    if($p->class == 'story-body__introduction') { 
     $found = true; 
     continue; 
    } 

    if($found) { 
     $text[] = $p->innertext; 
    } 
} 

echo '<pre>'; 
print_r($text); 

旁注:->innertext属性/属性不是一个函数 innertext()

补充信息:此答案实际上获取文档中的所有段落元素。如果事实证明,您只需要那些段落起点的兄弟姐妹,那么您也可以检查他们的父母是否处于同一水平。例如:

$found = false; 
$text = array(); 

$start_point = $html->find('p.story-body__introduction', 0); 
foreach($html->find('p') as $p) { 
    if($p->class == 'story-body__introduction') { 
     $found = true; 
     continue; 
    } 

    if($found && ($p->parent() == $start_point->parent())) { 
     $text[] = $p->innertext; 
    } 
} 

echo '<pre>'; 
print_r($text); 

这个答案只会从起点得到那些兄弟姐妹(同一级别)。

+1

我仍然想知道他们为什么叫它*简单* html dom ;-) – 2014-12-02 07:00:20

+0

@Ja͢ck是的_simple_是相当关闭。一个xpath查询就像你的答案应该足够了 – Ghost 2014-12-02 07:07:36

2

您可以为此使用XPath,它是DOM extension的一部分,并且随大多数PHP发行版一起提供。

$doc = new DOMDocument; 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

$query = '//p[preceding-sibling::p[@class="story-body__introduction"]]'; 

foreach ($xpath->query($query) as $node) { 
    echo $node->textContent, PHP_EOL; 
} 

它选择所有级别后面的所有段落元素。请注意,如果元素具有多个类,则需要使用其他查询。