Альтернативный подход:
аюсь выполнить некоторые операции очистки, когда действие, которое я выполняю над узлом, зависит от содержимого узла.
Это должен быть минимальный пример:
XML =
'<td class="id-tag">
<span title="Really Long Text">Really L...</span>
</td>
<td class="id-tag">Short</td>'
page = read_html(XML)
В основном, я хочу извлечьhtml_attr(x, "title")
если<span>
существует, иначе просто получитеhtml_text(x)
.
Код для первого:
page %>% html_nodes(xpath = '//td[@class="id-tag"]/span') %>% html_attr("title")
# [1] "Really Long Text"
Код для второго:
page %>% html_nodes(xpath = '//td[@class="id-tag"]') %>% html_text
# [1] "\n Really L...\n" "Short"
Настоящая проблема в том, чтоhtml_attr
подход не дает мне никакогоNA
или что-то подобное для узлов, которые не совпадают (даже если я позволюxpath
просто будь'//td[@class="id-tag"]'
во-первых, чтобы убедиться, что я сузился только до соответствующих узлов. Это разрушает порядок - я не могу сказать автоматически, была ли оригинальная структура"Really Long Text"
на первом или втором узле.
(Я думал о создании соединения, но отображение между сокращенным текстом и полным текстом не является взаимно однозначным / обратимым).
это кажется, на правильном пути - конструкция if / else внутриxpath
- но не работает.
В идеале я бы получил вывод:
# [1] "Really Long Text" "Short"