Цель: извлечь текст из определенного элемента (например, li), игнорируя различные смешанные теги, т.е. сгладить дочерний уровень первого уровня и просто вернуть конкатенированный текст каждого сплющенного потомка отдельно.
Пример:
<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
<ol>
<li>Central <a href="/Intelligence_Agency.html">Intelligence Agency</a>.</li>
<li>Culinary <a href="/Institute.html">Institute</a> of <a href="/America.html">America</a>.</li>
</ol>
</Div>
желаемый текст:
- Центральное разведывательное управление
- Кулинарный институт Америки
За исключением того, что привязанные метки не позволяют получить простой поиск.
Чтобы вернуть каждый тег li отдельно, мы используем просто:
//div[contains(@id,"mw-content-text")]/ol/li
но также включает в себя окружающие метки привязки и т.д. И
//div[contains(@id,"mw-content-text")]/ol/li/text()
возвращает только текстовые элементы, которые являются прямыми дочерними элементами li, т.е. "Central", "."...
Казалось логичным тогда искать текстовые элементы себя и потомков
//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]
но ничего не возвращает ничего!
Любые предложения? Я использую Python, поэтому я открыт для использования других модулей для последующей обработки.
(Я использую Scrapy HtmlXPathSelector, который кажется совместимым с XPath 1.0)