xpath выбор элементов и итерация по тегу

#python #xpath #hyperlink #extract

#python #xpath #гиперссылка #извлечь

Вопрос:

Рассмотрим

тег в моем html выглядит так

 <div class ="summary">
    <p>Best <a class="abch" href="/canvas">canvas</a> abcdefgh <a class="zph" href="/canvas">canvas</a>, I cycle them to garden</p>
</div>
  

Когда я делаю

 site.select('.//*[contains(@class, "summary")]/p/text()').extract()
  

Я получаю только текст p, а гиперссылки теряются.
Я хочу извлечь данные из

а также текстовые данные (например, canvas выше). Внутри может быть любое количество тегов

элемент. они могут присутствовать, а могут и не присутствовать в

тег.

Есть идеи, как извлечь все данные.

Ответ №1:

Я думаю, что две косые черты после p будут работать для вас. Одна косая черта / выбирает только дочерние элементы, две косые черты // будут включать более глубокие элементы. Поскольку текстовые узлы под a не являются прямыми дочерними элементами p , они не выбираются.

 site.select('.//*[contains(@class, "summary")]/p//text()').extract()
  

Обновить:

Отвечая на ваш комментарий: Я могу только думать о таком способе:

 for p in site.select('.//*[contains(@class, "summary")]/p'):
    p.select('//text()').extract()
  

Комментарии:

1. Ну, внутри html-документа есть много тегов summary. Итак, если я добавлю p //, это вернет текст всех этих сводных тегов. В то время как я хочу, чтобы описание извлекалось для одного тега за раз.

Ответ №2:

Когда вычисляется это выражение XPath:

 string(.//*[contains(@class, "summary")]/p)
  

результатом является строка, которая является конкатенацией (в порядке документа) всех текстовых узлов -потомков p .

Я предполагаю, что это то, что вы хотите.

Комментарии:

1. это вернет весь текст с тегами!

2. @Gaurav: Утверждение в вашем комментарии совершенно неверно — просто попробуйте посмотреть, каков результат! И читайте и учитесь! Никогда не делайте абсолютных заявлений о том, чего вы не знаете.