我来这里是想请您在QXmlQuery和Xpath方面提供一些帮助。我试图使用这个组合从几个HTML文档中提取一些数据。这些文档将被下载,然后使用http://tidy.sourceforge.net/进行清理。
问题是当我尝试我的XPath时。下面是一个示例代码:
[...]
<ul class="bullet" id="idTab2">
<li><span>Hauteur :</span> 1127 mm</li>
<li><span>Largeur :</span> 640 mm</li>
<li><span>Profondeur :</span> 685 mm</li>
<li><span>Poids :</span> 159.6 kg</li>
[...]干净的代码存储在QString“代码”中:
QStringList fields, values;
QXmlQuery query;
query.setFocus(code);
query.setQuery("//*[@id=\"idTab2\"]/*/*/string()");
query.evaluateTo(&fields);我的目标是得到所有的领域(豪特,大,亵渎,诗人,等等)其值(1127 mm,640 mm,685 mm,159.6 kg等)。
问题1
如您所见,我使用这个XPath //*[@id="idTab2"]/*/*/string()来恢复字段,因为//ul[@id="idTab2"]/li/span/string()不能工作。当我试图指定一个标签名时,它不会给我任何信息。它只适用于*。为什么?我检查了整洁函数返回的代码,XPath没有被修改。所以,我没看到任何问题。这正常吗?或者有件事我不知道..。
问题2
在前面的XHTML代码中,li标记封装了一个span标记和一些文本。我不知道如何只获取文本,而不知道span标记的内容。我试过:
//*[@id="idTab2"]/*/string()给出:Hauteur : 1127 mm Largeur : 640 mm Profondeur : 685 mm
//*[@id="idTab2"]/*[2]/string()给出:Nothing
因此,如果我没有错,li标记中的文本不是子节点,而是应该是。见已接受的答案:Select just text directly in node, not in child nodes。
谢谢你的阅读,我希望有人能帮我。
发布于 2013-08-26 10:08:28
要获取不同<li>中的元素(而不是文本表示),可以测试文本内容:
//*[@id=\"idTab2\"]/li[starts-with(span, "Hauteur")]其他物品也一样:
//*[@id=\"idTab2\"]/li[starts-with(span, "Largeur")]
//*[@id=\"idTab2\"]/li[starts-with(span, "Profondeur")]
//*[@id=\"idTab2\"]/li[starts-with(span, "Poids")]要获得这些<li>的字符串表示形式,可以在整个表达式周围使用string(),如下所示:
string(//*[@id=\"idTab2\"]/li[starts-with(span, "Poids")])"Poids : 159.6公斤“
要仅提取<li>中的文本节点,而不使用<span>,可以使用这些表达式选择<li>的直接子节点(<span>不是文本节点),并删除前导和尾随空格字符(normalize-space())。
normalize-space(//*[@id=\"idTab2\"]/li[starts-with(span, "Hauteur")]/text())
normalize-space(//*[@id=\"idTab2\"]/li[starts-with(span, "Largeur")]/text())
normalize-space(//*[@id=\"idTab2\"]/li[starts-with(span, "Profondeur")]/text())
normalize-space(//*[@id=\"idTab2\"]/li[starts-with(span, "Poids")]/text())最后一张是"159.6公斤“
https://stackoverflow.com/questions/18441239
复制相似问题