объединить текст из вложенных родных элементов, если он доступен, с текстом в родительском узле - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь извлечь текст из братьев и сестер, если он доступен, и объединить с текстом в родительском узле. Как это сделать в xpath? У моего HTML, показанного ниже, есть несколько случаев <sup> and <sub>.

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

['2','1/2']

Должен объединяться следующим образом ['<sup>'+'/'+ '<sub>']

<li data-ingredient="dry+white+wine">
 <span class="qty">2 </span>
 <span class="food">
     "cups"  
     <a href="https://www.test.com">dry white wine</a>
 </span>
</li>
<li data-ingredient="salt">
 <span class="qty">
     <sup>1</sup>
     "⁄"
     <sub>2</sub>
 </span>
 <span class="food"> teaspoon  <a href="https://www.test.com">salt</a>
 </span>
</li>

Я пробовал с помощью приведенных ниже команд и ссылался на несколько документов Scrapy. но не смог извлечь нужную информацию.

response.xpath('//span[@class="qty"][sup and sub]/text()').extract()
response.xpath('//span[@class="qty"]//sub/text()').extract()

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Моя идея состоит в том, чтобы выполнить итерацию по span.qty, извлечь оттуда текст и объединить его. Как здесь:

txt = """<li data-ingredient="dry+white+wine">
...  <span class="qty">2 </span>
...  <span class="food">
...      "cups"  
...      <a href="https://www.test.com">dry white wine</a>
...  </span>
... </li>
... <li data-ingredient="salt">
...  <span class="qty">
...      <sup>1</sup>
...      "⁄"
...      <sub>2</sub>
...  </span>
...  <span class="food"> teaspoon  <a href="https://www.test.com">salt</a>
...  </span>
... </li>"""
>>> from scrapy import Selector
>>> sel = Selector(text=txt)
>>> for qty in sel.css('span.qty'):
...     print ''.join([i.replace('"', '').strip() for i in qty.css('::text').extract()])
... 
2
1⁄2
0 голосов
/ 02 мая 2019

Попробуйте Bs4 для таких задач:

from bs4 import BeautifulSoup

html = response.xpath("//li[@data-ingredient='salt']/span[@class='qty']").extract()
soup = BeautifulSoup( html, "html.parser" ).get_text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...