Как получить текст между тегами заголовка (h3)? - PullRequest
0 голосов
/ 26 сентября 2018

У нас есть такие данные:

<h3>title1</h3>
<p> paragraph 1<p>
<p> paragraph 2<p>
<p> paragraph 3<p>
<h3>title2</h3>
<p> paragraph 4<p>
<p> paragraph 5<p>
<table>
    <tr>
        <td>data1</td>
        <td>data2</td>
     </tr>
</table>
<h3>title3</h3>
<p> paragraph 6<p>
<p> paragraph 7<p>
<p> paragraph 8<p>
<p> paragraph 9<p>
<h3>title4</h3>
<p> paragraph 10<p>
<p> paragraph 11<p>
<p> paragraph 12<p>

Как я могу получить данные между h3, то есть

  1. [пункт1, пункт2, пункт3]

  2. [параграф 4, параграф 5, данные 1, данные2]

  3. [параграф 6, параграф 7, параграф 8, параграф 9]

  4. [пункт 10, пункт 11, пункт 12]

Я использовал следующий XPath:

  1. hdoc.xpath('h3[contains(.,"title1")]//following-sibling::*[following::*[self::h3]]//text()')

  2. hdoc.xpath('h3[contains(.,"title2")]//following-sibling::*[following::*[self::h3]]//text()')

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Этот XPath,

//text()[    preceding::h3[. = 'title1'] 
         and following::h3[. = 'title2']]

выделит все текстовые узлы между h3 элементами с заданными строковыми значениями.

0 голосов
/ 26 сентября 2018

Попробуйте что-то вроде:

hdoc.xpath("//p[./preceding-sibling::h3[contains(text(),'title1')] and ./following-sibling::h3[contains(text(),'title2')]]/text()")

hdoc.xpath("//p[./preceding-sibling::h3[contains(text(),'title2')] and ./following-sibling::h3[contains(text(),'title3')]]/text()")

hdoc.xpath("//p[./preceding-sibling::h3[contains(text(),'title3')] and ./following-sibling::h3[contains(text(),'title4')]]/text()")

hdoc.xpath("//p[./preceding-sibling::h3[contains(text(),'title4')] and not(./following-sibling::h3)]/text()")

Если вы не хотите зависеть от текста каждого h3, вы можете получить их с количеством h3, которое каждый элемент имел раньше:

# For elements between title1 and title2
hdoc.xpath('//p[count(preceding-sibling::h3)=1]/text() | //table[count(preceding-sibling::h3)=2]//td/text()')

# For elements between title2 and title3
hdoc.xpath('//p[count(preceding-sibling::h3)=2]/text() | //table[count(preceding-sibling::h3)=2]//td/text()')
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...