Помощь с PHP и XPath - PullRequest
       25

Помощь с PHP и XPath

1 голос
/ 31 декабря 2010

Мне нужна помощь, чтобы сделать несколько вещей с XPath в PHP.

С любым данным HTML мне нужно:

  • Удалить все таблицы и их содержимое
  • Удалить все после первого тега h1
  • Сохранять только абзацы (ВКЛЮЧАЯ их внутренний HTML (ссылки, списки и т. Д.))

С регулярным выражением у меня все работает отлично. Однако, столкнувшись с вложенными таблицами, я решил, что действительно глупо анализировать HTML с помощью регулярных выражений.

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

С любым данным HTML мне нужно:

• Удалить все таблицы и их содержимое

• Удалить все после первого h1 тег

• Хранить только абзацы (ВКЛЮЧАЯ их внутренний HTML (ссылки, списки и т. д.))

Это можно сделать очень легко с помощью XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:h="http://www.w3.org/1999/xhtml" >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <!-- Copy every node except when overriden
      by another template -->
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <!-- Remove all tables and their contents -->
 <xsl:template match="h:table"/>

 <!-- Remove everything after the first h1 -->
 <xsl:template match="node()[preceding::h:h1]"/>

 <!-- Keep only paragraphs (INCLUDING
      their inner HTML (links, lists, etc))
  -->
 <xsl:template match=
 "node()[not(self::h:p) and not(ancestor::h:p)]">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

Если имена ваших элементов не находятся в пространстве имен XHtml, просто удалите любое вхождение h: в приведенном выше коде.

0 голосов
/ 31 декабря 2010

Подумайте об использовании HTML DOM-парсеров, так как это будет намного проще, чем XML.Есть некоторые парсеры, которые также поддерживают операторы xpath.Но самое сложное в том, что не весь HTML соответствует строгим стандартам xhtml, поэтому правила не всегда легко применять.Вот пара парсеров DOM, с которыми я столкнулся.Некоторые поддерживают xpath, а некоторые просто имеют другие способы выбора контента:

http://simplehtmldom.sourceforge.net/

http://php.net/manual/en/simplexmlelement.xpath.php

...