Предположим, вы использовали 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 вернет "Акрон" из вашего XML:
substring-before(//div[@class ='right_location']//a[1], ' Office')
Заметки:
a[1]
чтобы выбрать первый из возможных нескольких a
.substring-before
тем, как отключить ' Office'
.a
обычно выполняется вне самого XPath (в XSLT или Python или на другом языке хостинга, из которого вызывается библиотека XPath для выбора), но если вы используете XPath 2.0, вы можете рассмотреть (a) использование выражения for, (б) используя предложение Mathias Müller о tokenize() с "Office" в качестве разделителя или (c) замените() "Управление" ничем, если хотите просто вернуть "Akron Cleveland" без "Office".
Akron Office Another Office Yetanother Office
? Вы можете маркировать строку, используя «Office» в качестве разделителя.