Разбор HTML от определенной начальной точки до определенной конечной точки?

0

У меня есть HTML:

<hr noshade>
<p><a href="#1">Some text here</a></p>
<p style="margin-top:0pt;margin-bottom:0pt;line-height:120%;"><span style="color:#000000;font-weight:bold;">This is some description</span></p>
<hr noshade> <!-- so <hr noshade> is the delimiter for me -->
<p><a href="#2">Some more text here</a></p>
<p style="margin-top:0pt;margin-bottom:0pt;line-height:120%;"><span style="color:#000000;font-weight:bold;">This is description for some more text</span></p>
<hr noshade>

Во время разбора с использованием nokogiri я хочу распечатать информацию между каждым из этих наборов тегов, которые разделены моим собственным разделителем <hr noshade>. Таким образом, первый блок должен печатать информацию между всеми "p" тегами, которые лежат между двумя hr noshade тегами и так далее.

Теги:
xpath
parsing
nokogiri

1 ответ

1
Лучший ответ

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

У меня есть только полузадачное решение

Вы можете использовать это выражение XPath:

.//hr[1][@noshade]
  /following-sibling::*[not(self::hr[@noshade])]
                       [count(preceding-sibling::hr[@noshade])=1]

для первой группы между <hr noshade> 1 и 2,

тогда,

.//hr[2][@noshade]
  /following-sibling::*[not(self::hr[@noshade])]
                       [count(preceding-sibling::hr[@noshade])=2]

для элементов между <hr noshade> 2 и 3 и т.д.

Что выбирают эти выражения:

  1. все братья и сестры <hr noshade>, заданные его положением N
  2. которые имеют только N <hr noshade> предыдущих братьев и сестер, то есть располагаются в N-й группе
  3. и которые не являются <hr noshade> самими

Поскольку он выберет несколько элементов между 2 <hr noshade>, вам, возможно, придется зацикливать результаты и извлечь данные для каждого элемента sibling.

Кто-нибудь на более общем решении?

  • 0
    Спасибо за ваш ответ. Да, это имеет какой-то смысл для меня. Сейчас я пытаюсь представить более общее решение, потому что html-файл автоматически генерируется программным обеспечением, поэтому я не знаю, сколько <hr noshade> может его сгенерировать.
  • 0
    Итак, я попробовал это: путь = '// hr [1] [@ noshade] / follow-sibling :: * [not (self :: hr [@noshade])] [count (previous-sibling :: hr [@] noshade]) = 1] 'xpath = doc.xpath (path) Но я получаю сообщение об ошибке как «неожиданный»] после «равного» (Nokogiri :: CSS :: SyntaxError) "
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню