У меня нет полного ответа, но вы можете использовать функцию text (), описанную в wiki (см. Поиск во внутреннем HTML ).
doc.search("*[text()='Text3']")
вернется
#<Hpricot::Elements[{elem <element3> " Text3 " </element3>}, " Text3 "]>
Затем вы можете пройтись по ним и проверить, что они являются действительными элементами:
doc.search("*[text()='Text3']")[0].elem?
Вернется true
. Тогда как [1]
вернул бы false
. Однако, где это падает, вы пытаетесь найти text4
, так как это возвращает:
#<Hpricot::Elements["\n text4\n"]>
т.е. не фактический элемент. Поэтому, возможно, в этих случаях (как вы определяете эти случаи, я не знаю), вы можете проверить, является ли это элементом, и, если false, получить родительский элемент
doc.search("*[text()='text4']")[0].parent
Извините, у меня нет полного ответа, но я подумал, что слово "text ()" стоит упомянуть на данный момент.