2009-10-14 91 views
0

我正在使用XPath从HTML页面选择节。但是,当我使用XPath来提取节点时,它正确地只选择文本围绕 HTML标签和而不是 HTML标签本身。使用XPath抽取具有子节点的完整节点

样本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> 

我有以下XPath

/body/div 

我得到以下

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

我想

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...

如果您在样本HTML注意到没有在内容<i/><b /> HTML标签。当我提取内容时,这些标签中的单词会“丢失”。

我在PHP中使用SimpleXML,如果这有所作为。

+0

我无法重现您的结果。用echo $ result(即将simplexmlelement转换为字符串)并使用 - > asXML()在输出中获得“内部”标签。你能提供实际的测试代码吗? – VolkerK 2009-10-14 14:22:50

+0

好的,所以我转换为HTML,然后将其加载到SimpleXML中...编辑该问题以反映此问题。 – null 2009-10-14 18:07:27

回答

2

你的XPath是正常,虽然你可以删除最后/.因为这是多余的:

/atom/content 

所有的HTML是<![CDATA ]]>部分的内部,从而在XML DOM,你其实只文本那里。 <i><b>标记不会被标记为标记,而只会显示为文本。使用CDATA部分是完全一样的,如果你的XML是这样写的:

<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> 

所以,这是你与<content>元素事后说正在丢失这些标签做什么。你以后是将文本解析为HTML,还是通过过滤器来运行它,或者类似的东西?

+0

删除了后期......但问题有所改变。 – null 2009-10-14 18:10:04

+0

我不认为XPath是问题,所以你可以发布你的PHP代码? – 2009-10-14 19:57:49

0

我不知道如果SimpleXML是不同的,但对我来说,似乎你需要确保你选择的所有节点类型,而不仅仅是文本。在标准的XPath中,你会做/ body/div/node()

1

SimpleXML不喜欢文本节点,所以你必须改用自定义解决方案。

您可以在每个div元素上使用asXML()然后取出div标签,也可以将div元素转换为DOMNode当时的环比$div->childNodes和序列化每一个孩子。请注意,如果可用,您的HTML实体很可能会被实际字符替换。

或者,您可以查看SimpleDOM project并使用其innerHTML()方法。

$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()); 
} 
相关问题