Выражение XPath для выбора текста не в абзаце - PullRequest
0 голосов
/ 07 августа 2010

Я разрабатываю утилиту для очистки веб-страниц, которая использует XPath для извлечения информации с веб-страниц.

Одно из применений этого программного обеспечения - очистка обзоров шоу с веб-сайтов.Одна страница, которую я пытаюсь почистить, - это последние обзоры The Guardian на фестивале в Эдинбурге: http://www.guardian.co.uk/culture/edinburghfestival+tone/reviews

Внизу я хочу найти раздел под названием «Самые последние».Выражение XPath для списка элементов обзора (то есть изображения, звездочек, даты, объявления и т. Д.) Имеет вид

//ul[@id='auto-trail-block']

, который возвращает список элементов li, каждый из которых соответствует одному элементу обзора.

Если я хочу сослаться только на объявление, самое близкое, что я могу получить, это сказать

//ul[@id='auto-trail-block']/div[@class='trailtext']

, но когда я собираю текстовое содержимое из каждого элемента списка, оно включаетмного Javascript и неприятных вещей, которые мне не нужны.Я не могу сослаться на саму рекламу, потому что она находится не внутри элемента ap, а внутри элемента div, который содержит элементы сценария и сильные элементы, которые содержат соответственно javascript и несвязанный текст.

В отладчике он выглядит как DOMкак это:

<ul id="auto-trail-block" ...>
  <li ...>
    <div ...>
    <div ...>
      <div ...>
      <div class="trailtext">
        <script ...>
        <div ...>
        <span ...>
        <strong .../>
        <br/>
        The Text I want to copy!
        <strong .../>
        <a .../>
        <div .../>
      </div>
    </div>
  </li>
  <li ...>
    ...
  </li>
  ...
</ul>

Есть ли способ сослаться на текстовое содержимое, содержащееся только в div, а не в его подэлементах?

Ответы [ 2 ]

1 голос
/ 07 августа 2010

Если вы хотите, чтобы дочерние элементы текстового узла имели значение div[@class='trailtext'], используйте text ()

//ul[@id='auto-trail-block']//div[@class='trailtext']/text()
1 голос
/ 07 августа 2010

Мой подход заключается в том, чтобы выбрать trailtext div, удалить теги сценария с их содержимым и все теги HTML. Осталось бы содержание, которое вы хотите.

Просто интересно - что возвращает внутренний текстовый узел //ul[@id='auto-trail-block']/div[@class='trailtext']? Я бы предположил, в основном, всплеск, поэтому очистка тегов сценария должна почти привести вас туда.

...