Цель: Извлечь текст из определенного элемента (например, 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, т.е. 'Центральный',' .'...
Тогда казалось логичным искать текстовые элементы self и потомков
//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]
, но это вообще ничего не возвращает!
Есть предложения? Я использую Python, поэтому я открыт для использования других модулей для постобработки.
(Я использую Scrapy HtmlXPathSelector, который кажется совместимым с XPath 1.0)