Скопировать данные как <li>между двумя известными ключевыми словами, инкапсулированными как тег <b> - PullRequest
0 голосов
/ 10 октября 2018

Я использую скрап для утилизации этот вид продукта .Я хочу отбросить данные как <li> между <b> Индикация </b> и <b> Контраст-индикации </b>, а затем следующее <b></b> для каждого ключевого слова не предсказуемо.

Вот исходный код запрашиваемой страницы.

<article class="col-md-10 col-md-push-1">

<p><b>Caractéristiques des croquettes pour chat Royal Canin Veterinary Diet - Urinary S/O LP 34 :</b>
</p><ul>
<li>struvite.</li>

<li>la vessie.</li>

<li>d'oxalate de calcium.
</li>

<li>maintien de la muqueuse vésicale </li></ul><p></p>

<p><b>Remarques :</b>
</p><ul>
<li> Urinary S/O Feline</li>
<li>chez le chat âgé, rénal avant la prescription de l'Urinary  S/O Feline</li></ul><p></p>

<p><b>Indications :</b>
</p><ul>

<li>dissolution des calculs urinaires de struvite</li>
<li>gestion des récidives d’urolithiase à struvite et à oxalate de calcium dans un seul aliment</li></ul><p></p>

<p><b>Contre-indications :</b>
</p><ul>
<li>insuffisance rénale chronique, acidose métabolique</li> 
<li>traitement avec des médicaments acidifiant l'urine</li>
<li>lactation, gestation, croissance</li></ul><p></p>

<p><b>Durée du traitement :</b> 5 à 12 semaines sont nécessaires pour obtenir la dissolution des calculs de struvites.<br>
P</p>
                    </article>

Первый подход : с регулярным выражением, разобрать как свободный текст.Не удалось получить ничего хорошего с этой обычной формулой (<b>[Ii]ndication[s]{0,1}.*?</b>)([\n\r]*.*)(<b>Contre-[Ii]ndication[s]{0,1}.*?</b>).Это работало хорошо в тестере , но .re в Python не нашел соответствия.Хорошо, давайте двигаться дальше.

Второй подход : я пытался извлечь с помощью scrapy:

l.add_xpath('contre_indication','//*[@id="description-panel"]/div/article/b[starts-with(text(),"Contre-indications")]/following-sibling::ul/li/text()')
l.add_xpath('contre_indication','//*[@id="description-panel"]/div/article/p/b[starts-with(text(),"Contre-indications")]/following-sibling::ul/li/text()')
l.add_xpath('indication','//*[@id="description-panel"]/div/article/b[starts-with(text(),"Indication")]/following-sibling::ul/li/text()')
l.add_xpath('indication','//*[@id="description-panel"]/div/article/p/b[starts-with(text(),"Indication")]/following-sibling::ul/li/text()')

Иногда ключевое слово xpath - это / b / отдельно, а иногда a / p / b.Это причина, почему существует два xpath для каждого.Здесь, в лучшем случае, у меня есть весь текст между <li>, но без различия показаний / контр-указаний.

Ожидаемый результат будет:

Indication : ["dissolution des calculs urinaires de struvite","gestion des récidives d’urolithiase à struvite et à oxalate de calcium dans un seul aliment"]
Contre-indication : ["insuffisance rénale chronique, acidose métabolique"..."lactation, gestation, croissance"]

Я очень заинтересован в том, чтобы разобраться в подходе к решению этой проблемы.

С уважением

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете сделать это с помощью xpath селекторов:

'//p[contains(b/text(),"Contre-indications")]/following-sibling::ul[1]/li/text()'

Объяснение xpath:

//p - выбрать все узлы абзаца
[contains(b/text(),"Contre-indications")] - которые содержат некоторыетекст в тексте дочернего узла b
//following-sibling::ul[1] - выберите одноуровневый элемент узла абзаца, который является первым из неупорядоченного вида списка.
//li/text() - выберите текст любого дочернего элемента, являющегося узлами списка

Если вызапустить его в скорлупе:

$ scrapy shell
> body = ...
> from parsel import Selector
> sel = Selector(text=body)
> sel.xpath('//p[contains(b/text(),"Indication")]/following-sibling::ul[1]/li/text()').extract()
['dissolution des calculs urinaires de struvite', 'gestion des récidives d’urolithiase à struvite et à oxalate de calcium dans un seul aliment']
> sel.xpath('//p[contains(b/text(),"Contre-indications")]/following-sibling::ul[1]/li/text()').extract()
['insuffisance rénale chronique, acidose métabolique', "traitement avec des médicaments acidifiant l'urine", 'lactation, gestation, croissance']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...