Equivalente de que en el raspado?

Estoy tratando de ejecutar un raspado donde la acción que realizo en un nodo está condicionada al contenido del nodo.

Este debería ser un ejemplo mínimo:

XML =
'<td class="id-tag">
    <span title="Really Long Text">Really L...</span>
</td>
<td class="id-tag">Short</td>'

page = read_html(XML)

Básicamente, quiero extraerhtml_attr(x, "title") Si<span> existe, de lo contrario solo consiguehtml_text(x).

El código para hacer lo primero es:

page %>% html_nodes(xpath = '//td[@class="id-tag"]/span') %>% html_attr("title")
# [1] "Really Long Text"

El código para hacer lo segundo es:

page %>% html_nodes(xpath = '//td[@class="id-tag"]') %>% html_text
# [1] "\n    Really L...\n" "Short"  

El verdadero problema es que elhtml_attr enfoque no me da ningunaNA o algo similar para los nodos que no coinciden (incluso si dejo que elxpath ser sólo'//td[@class="id-tag"]' primero para estar seguro de que me he reducido a solo los nodos relevantes primero. Esto destruye el orden: no puedo decir automáticamente si la estructura original tenía"Really Long Text" en el primer o el segundo nodo.

(Pensé en unirme, pero el mapeo entre el texto abreviado y el texto completo no es uno a uno / invertible).

Esta parece estar en el camino correcto: una construcción if / else dentro delxpath Pero no funciona.

Lo ideal sería obtener la salida:

# [1] "Really Long Text" "Short" 

Respuestas a la pregunta(2)

Su respuesta a la pregunta