Tbody-тег в xpath, созданный пожарной ошибкой - PullRequest
1 голос
/ 20 ноября 2011

Я пытаюсь извлечь некоторые данные из онлайн htmls, используя библиотеку ruby ​​hpricot. Я использую огненную ошибку расширения firefox, чтобы получить xpath выбранного элемента.

В производимом xpath-выражении всегда присутствует дополнительный тег tbody. В некоторых случаях я должен удалить тег tbody из выражения, чтобы получить результаты, в то время как в других случаях я должен сохранить тег, чтобы получить результаты.

Я просто не могу понять, когда сохранять тег tbody, а когда нет.

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

Чтобы учесть и избежать этой проблемы, используйте выражения XPath следующего вида :

 /locStep1/locStep2/.../table/YourSubExpression
|
 /locStep1/locStep2/.../table/tbody/YourSubExpression

Если table не имеет tbody child , то второй аргумент оператора объединения (|) не выбирает никаких узлов, а первый аргумент объединения выбирает требуемый узлы.

В качестве альтернативы, если table имеет a tbody child , то первый аргумент оператора объединения не выбирает узлов, а второй аргумент объединения выбирает требуемый узлы.

Конечный результат : в обоих случаях выбираются нужные узлы

1 голос
/ 20 ноября 2011

Что ж, с HTML 4 или с XHTML, служащим text / html, парсер всегда выводит элемент tbody, чтобы обернуть tr элементы, которые являются прямыми потомками элемента table в разобранной разметке, поэтому внутри DOM браузера у HTML table всегда есть tbody, содержащий любые элементы tr, а инструмент, такой как Firebug, дает вам путь, который работает с DOM Firefox / Mozilla. Я не знаю, какой синтаксический анализатор использует ваша библиотека Ruby, возможно, он использует синтаксический анализатор XML для документов XHTML, и синтаксический анализатор XML не выводит tbody элементов для table элементов.

0 голосов
/ 21 ноября 2011

HTML5 всегда добавляет элемент tbody, если его там явно нет - это часть стратегии исправления для работы с недействительным HTML. Если вы хотите справиться с различными средами, использование таблицы // tr может иметь смысл.

...