У меня есть такой тег HTML:
<html> <body> <h1>This is a <b>xyz</b> test</h1> </body> </html>
Если я сделаю hxs.select('/html/body/h1/text()').extract(), результат будет This is a test. Как мне указать XPath, чтобы вывод был This is a xyz test.
hxs.select('/html/body/h1/text()').extract()
This is a test
This is a xyz test
Попробуйте сделать /html/body/h1//text(). Двойная косая черта найдет все спуски узла, не обязательно дочерние элементы
/html/body/h1//text()
Каждый узел, выбранный выражением XPath, имеет соответствующее строковое значение. От спецификации :
Строковое значение узла элемента - это конкатенация строковые значения всех потомков текстового узла узла элемента в заказ документов.
Что именно то, что вы хотите. Это строковое значение часто используется неявно, но вы можете явно получить его с помощью функции string. Опять спецификация :
string
Строковая функция преобразует объект в строку следующим образом: Набор узлов преобразуется в строку, возвращая строковое значение узел в наборе узлов, который является первым в порядке документа. Если набор узлов пуст, возвращается пустая строка.
Строковая функция преобразует объект в строку следующим образом:
Используйте это так:
string(/html/body/h1)
Возможно, вам нужна функция string .
Вам нужно только написать: '/html/body/h1'.С помощью функции text() вы выбираете текстовые узлы, которые являются потомками h1 (xyz - нет).
'/html/body/h1'
text()
h1
xyz