[英]Screen Scraping with PHP and XPath
有没有人知道如何在使用XPath提取数据时保持文本格式?
我目前正在提取所有块
<div class="info"> <h5>title</h5> text <a href="somelink">anchor</a> </div>
从一页。 问题是当我访问nodeValue时,我只能获得纯文本。 如何捕获包含格式的内容,即h5和代码中的静止?
提前致谢。 我搜索了谷歌上可以想象的每一个组合,但没有运气。
如果你将它作为DomDlement $元素作为DomDlement $元素的一部分,那么你将需要做类似的事情:
$string = $dom->saveXml($element);
元素的NodeValue实际上是文本值,而不是结构化XML。
我想补充一下Ciaran McNulty的答案
你可以在SimpleXml中做同样的事情:
$simplexml->node->asXml(); // saveXml() is now an alias
并扩大报价
元素的NodeValue实际上是文本值,而不是结构化XML。
您可以按如下方式考虑您的节点:
<div class="info">
<__toString()> </__toString()>
<h5>title</h5>
<__toString()> text </__toString()>
<a href="somelink">anchor</a>
<__toString()> </__toString()>
</div>
对$element->nodeValue
的调用就像调用$element->__toString()
,它只能获取__toString()元素。 我创建的虚构__toString()
正式定义为XML_TEXT_NODE
。
XPath语言旨在嵌入另一种语言(例如DOM API,XSLT,XQuery,...),不能单独使用 。 原始问题没有说明所需的嵌入是什么。
当XPath嵌入XSLT时,下面是一个非常简单和简短的解决方案 。
这种转变 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="div[@class='info']">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
当应用于此xml文档时 :
<html>
<body>
<div class="info">
<h1>title1</h1> text1
<a href="somelink1">anchor1</a>
</div>
Something else here
<div class="info">
<h2>title2</h2> text2
<a href="somelink2">anchor2</a>
</div>
Something else here
<div class="info">
<h3>title3</h3> text3
<a href="somelink3">anchor3</a>
</div>
</body>
</html>
产生想要的结果 :
<div class="info">
<h1>title1</h1> text1
<a href="somelink1">anchor1</a>
</div>
Something else here
<div class="info">
<h2>title2</h2> text2
<a href="somelink2">anchor2</a>
</div>
Something else here
<div class="info">
<h3>title3</h3> text3
<a href="somelink3">anchor3</a>
</div>
您需要确保您的xpath查询'结束'在<div class="info">
。 但是,由于XPath的工作方式,您仍然可以在单独的节点中获取所有“子标签”。 你只需要连接它们。
你也可以使用XPath的连接功能,因为我没有使用它,我不能说你可能会遇到什么问题。
div/node()
应该做的伎俩。
输入示例:
<div class="info">
some <h5>title</h5> text <a href="somelink">anchor</a> more text
</div>
示例XSLT样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<newtag>
<xsl:copy-of select="div/node()"/>
</newtag>
</xsl:template>
</xsl:stylesheet>
示例输出:
<?xml version="1.0" encoding="utf-8"?>
<newtag> some<h5>title</h5> text <a href="somelink">anchor</a> more text</newtag>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.