Выражение xpath, которое пропускает нежелательную часть возвращаемого текста

0

Предположим, вы использовали htmlTreeParse() для получения этого фрагмента кода XML:

   <div class="right_location">
      <h3>Office Locations</h3>
      <div class="right_location_in">
          <h4>
             <a href="/?t=10&L=234&format=XML&p=5406">Akron Office</a>
          <h4>
          <address>
          <address>
  </div>
  <div class="right_location_in">
         <h4>
            <a href="/?t=10&L=235&format=XML&p=5406">Cleveland Office</a>

После этого существует неизвестное количество офисов, но это выражение возвращает их. Все они добавляют "Office".

xpathSApply(doc, "//div[@class ='right_location']//a", xmlValue, trim = TRUE)
[1] "Akron Office"

Как я могу исключить ненужное "Управление" из каждого? Я думаю, что не могу использовать отрицательный элемент contains() потому что выражение не будет соответствовать. Возможно, у text() есть возможность пропустить указанный текст?

Ответ подстроки-befor() хорош, но мне нужно, чтобы она работала для каждого местоположения, а не только для первого.

Теги:
xpath
parsing

1 ответ

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

Следующий XPath вернет "Акрон" из вашего XML:

substring-before(//div[@class ='right_location']//a[1], ' Office')

Заметки:

  1. Используйте a[1] чтобы выбрать первый из возможных нескольких a.
  2. Используйте substring-before тем, как отключить ' Office'.
  3. Обработка каждого соответствия a обычно выполняется вне самого XPath (в XSLT или Python или на другом языке хостинга, из которого вызывается библиотека XPath для выбора), но если вы используете XPath 2.0, вы можете рассмотреть (a) использование выражения for, (б) используя предложение Mathias Müller о tokenize() с "Office" в качестве разделителя или (c) замените() "Управление" ничем, если хотите просто вернуть "Akron Cleveland" без "Office".
  • 0
    Отлично, потому что я никогда не использовал substring-before (). На самом сайте есть два других города после Акрона. // a поднимает их все, если я опускаю substring-before (), но после них у всех есть "Office". Как я могу извлечь эти города, без "Офис"?
  • 0
    Вы имеете в виду фактический вводимый текст - « Akron Office Another Office Yetanother Office ? Вы можете маркировать строку, используя «Office» в качестве разделителя.
Показать ещё 4 комментария

Ещё вопросы

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