XPath для элемента, который следует за определенным текстом абзаца, вложенным в div? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь выбрать текст "Часть Солнце, Солнце" и "Трава", "Комнатное растение" из HTML ниже.

В <div class="specifics"> есть больше этих "строк", и интересующий меня текст всегда идет после определенных тегов абзаца, содержащих определенный текст, такой как "Light:" и "Type:" ниже.

Редактировать: Чтобы прояснить все "значения" div, меня интересуют только те, которые имеют конкретные "имена". Поэтому я хочу проверить текст абзацев, вложенных в элементы <div class="name">, и, если это то, что мне интересно, выделите текст внутри последующего элемента <div class="value">.

<div class="specifics">
  <div class="row">
    <div class="name">
      <p>Light:</p>
    </div>
    <div class="value">
      <p>Part Sun, Sun</p>
    </div>
  </div>
  <div class="row">
    <div class="name">
      <p>Type:</p>
    </div>
    <div class="value">
      <p>
        <a href="https://www.bhg.com/gardening/plant-dictionary/herb/">Herb</a>, <a href="https://www.bhg.com/gardening/plant-dictionary/houseplant/">Houseplant</a>
      </p>
    </div>
  </div>
  ...more rows...
</div>

Я пробовал это (используя Scrapy):

trait = response.xpath("//div[@class='specifics']")
trait.xpath(".//div[@class='row']/div[@class='name']/p[text()='Light:']/../../div[@class='value']/p/text()[normalize-space()]") 

Первая строка в порядке, но вторая возвращается \n \n

Извините за плохое редактирование, ниже приведен пример того, как выглядит элемент абзаца.

Второе редактирование: Есть куча пустых строк, и когда я выбираю просто / p без текста (), я все равно получаю только кучу \ n без текста? Пробовал нормализовать пространство как указано выше.

  <p>




                                            Part Sun, 






                                            Sun



  </p>

1 Ответ

0 голосов
/ 30 апреля 2018

Чтобы выбрать нужные элементы, вы можете сделать что-то вроде этого: /div[@class='specifics']/div[@class='row']/div[@class='value']/p

Добавление /text() в конце приведет к захвату Part Sun, Sun в вашем первом ряду, но поскольку во втором ряду есть дополнительные вложенные элементы, этот текст не будет выбран.

Вместо этого вы можете использовать /string(), который также будет извлекать текст из детей. /div[@class='specifics']/div[@class='row']/div[@class='value']/p/string()

Если вам также нужно удалить пробелы, вы можете использовать normalize-whitespace() или translate(input, charsToReplace, replacement).

  • /div[@class='specifics']/div[@class='row']/div[@class='value']/p/normalize-space(string()). Используя этот инструмент , я получаю выходные данные String='Part Sun, Sun' и String='Herb, Houseplant'

  • /div[@class='specifics']/div[@class='row']/div[@class='value']/p/translate(string(), '&#xA;', ''), где &#xA; - символ новой строки, но вы также можете добавить других символов , которые необходимо удалить. источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...