XPath kullanarak alt düğümleri ile tam bir düğüm çekerek

3 Cevap php

Ben bir HTML sayfası bir bölümünü seçmek için XPath kullanıyorum. Ben düğüm ayıklamak için XPath kullanın Ancak, bu correctly sadece metin surrounding HTML etiketlerini ve not HTML etiketlerini kendileri seçer.

Sample HTML

<body>
    <div>
      At first glance you may ask, &#8220;what <i>exactly</i>
      do you mean?&#8221; It means that we want to help <b>you</b> figure...
    </div>
</body>

I have the following XPath

/body/div

I get the following

At first glance you may ask, &#8220;what do you mean?&#8221; It means that we want to help figure...

I want

At first glance you may ask, &#8220;what <i>exactly</i> do you mean?&#8221; It means that we want to help <b>you</b> figure...

Eğer Örnek HTML fark ederseniz bir <i/> ve içeriği <b /> HTML etiketleri vardır. Ben içeriğini ayıklamak zaman o etiketleri içinde kelime "kaybolabilir".

Bir fark yaparsa ben PHP SimpleXML kullanıyorum.

3 Cevap

Bu gereksiz olarak size nihai /. kaldırabilirsiniz olsa XPath, gayet:

/atom/content

XML DOM aslında sadece orada metin var bu yüzden tüm HTML bir <![CDATA ]]> bölümün içindedir. <i> ve <b> etiketleri etiketleri olarak çözümlenen ama olmayacak, sadece metin olarak görünecektir. XML bu gibi yazılmış sanki bir CDATA bölümü kullanarak tam aynıdır:

<atom>
    <content>
      At first glance you may ask, &amp;#8220;what &lt;i&gt;exactly&lt;/i&gt;
      do you mean?&amp;#8221; It means that we want to help &lt;b&gt;you&lt;/b&gt; figure...
    </content>
</atom>

Yani, o etiketleri düşüyor sonradan <content> elemanı ile yapıyoruz odur. Daha sonra HTML olarak metin ayrıştırma, ya da bir filtre, ya da onun gibi bir şey ile çalışıyor musunuz?

Bunun yerine özel bir çözüm kullanmak zorundasınız SimpleXML metin düğümlerini sevmez.

Sen asXML() kullanabilirsiniz her div elemanı daha sonra div etiketlerini kaldırmak veya {[(4 div elemanları dönüştürebilirsiniz )]} o $div->childNodes üzerinde döngü s ve her çocuk serialize. HTML kişiler büyük olasılıkla gerçek karakterler kullanılabilir yerini unutmayın.

Alternatif olarak, SimpleDOM project bir göz atın ve innerHTML() yöntemini kullanabilirsiniz.

$html = 
'<body>
    <div>
      At first glance you may ask, &#8220;what <i>exactly</i>
      do you mean?&#8221; It means that we want to help <b>you</b> figure...
    </div>
</body>';

$body = simpledom_load_string($html);

foreach ($body->xpath('/body/div') as $div)
{
    var_dump($div->innerHTML());
}

SimpleXML farklı ise bilmiyorum ama bana size tüm düğüm türleri değil, sadece metin seçme emin olmak gerekir gibi görünüyor. Standart XPath'daki yapardın / beden / div / düğüm ()