2013-08-26 3 views
1

Я здесь, чтобы спросить вас с помощью QXmlQuery и Xpath. Я пытаюсь использовать эту комбинацию для извлечения некоторых данных из нескольких HTML-документов. Эти документы загружаются, а затем очищаются с помощью HTML Tidy Library.Qt: QXmlQuery и XPaths

Проблема в том, что я пытаюсь использовать 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); 

Моя цель состоит в том, чтобы получить все поля (высокомерие, Largeur, Profondeur, POIDS, и т.д. .) и их значение (1127 мм, 640 мм, 685 мм, 159,6 кг и т. д.).

Вопрос 1

Как вы можете видеть, я использую этот XPath //*[@id="idTab2"]/*/*/string() для восстановления поля, потому что это: //ul[@id="idTab2"]/li/span/string() не работает. Когда я пытаюсь указать имя тега, это ничего не дает. Он работает только с *. Зачем ? Я проверил код, возвращаемый функцией tidy, и XPath не изменяется. Итак, я не вижу никакого пролета. Это нормально ? Или, может быть, есть что-то я не знаю ...

Вопрос 2

В предыдущем коде XHTML, теги Li обернуть поверочного тег и текст. Я не знаю, как получить только текст, а не содержимое тега 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.

Спасибо за чтение, надеюсь, кто-то может мне помочь.

ответ

1

Чтобы получить элементы (не текстовое представление) внутри различных <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 кг»

+0

Здравствуйте @paul т., спасибо за ответ, но это не похоже на работу тоже. Я думаю, проблема возникает из Qt, которая, похоже, не оценивает выражение XPath как ожидалось. Я не понимаю, почему ... Я буду искать больше об этом. – Pwet

+0

ОК. Fyi, я тестировал тех, кто использует 'lxml' –

Смежные вопросы