greenrec_xpath =
"//*[preceding::h3[contains(text(), 'General Information')]
and following::h3[contains(text(), 'Known Hazards')]]"
Вы очень близки к тому, чтобы найти выражение XPath, которое выбирает нужные текстовые узлы:
Использование :
//*[preceding::h3[1][contains(., 'General Information')]
and following::h3[1][contains(., 'Known Hazards')]
]/text()[normalize-space()]
Имейте в виду, что это выражение выделяет множество текстовых узлов (в данном конкретном случае 5).
Если вы хотите получить одну строку, вам нужно получить строковые значения каждого выделенного текстаобъединить и объединить их вместе в одну строку. В случае, если вы можете использовать только XPath 1.0, вам нужно будет выполнить эту конкатенацию строк в коде вызывающего программирования (не XPath).
Если вы можете использовать XPath 2.0 (или более позднюю версию), используйте :
string-join(
//*[preceding::h3[1][contains(., 'General Information')]
and following::h3[1][contains(., 'Known Hazards')]
]/text()[normalize-space()]/string(.)
,
''
)