Scrapy - используйте «normalize-space» со списком предметов - PullRequest
0 голосов
/ 23 апреля 2019

Попытка удалить escape-символы и пробелы из списка html. Я использую normalize-space (), но не смог применить его ко всему списку. Я тестирую свой код, используя scrapy shell

scrapy shell https://universalmotors.ru/boardmotors/suzuki/suzuki-df-4-s/

<tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">
              <td class="label_table" itemprop="name">Мощность двигателя (л.с.)</td>
              <td class="value_table">
                <span itemprop="value">4</span>
              </td>
            </tr>
<tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">
              <td class="label_table" itemprop="name">Тип масла в двигателе</td>
              <td class="value_table">
                <span itemprop="value">10W-30 10W-40</span>
              </td>
            </tr>

Вот что я попробовал

[item.normalize-space() for item in response.xpath('//tr[@itemprop="additionalProperty"]').extract()]

Но я получаю ошибку

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "<console>", line 1, in <listcomp>
AttributeError: 'str' object has no attribute 'normalize'

Работает только для

[item.strip() for item in response.xpath('//tr[@itemprop="additionalProperty"]').extract()]

тогда я получаю следующий

['<tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">\n              <td class="label_table" itemprop="name">Мощность двигателя (л.с.)</td>\n              <td class="value_table">\n                <span itemprop="value">4</span>\n              </td>\n            </tr>', '<tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">\n              <td class="label_table" itemprop="name">Тип масла в двигателе</td>\n              <td class="value_table">\n 

Моя цель - начать:

Мощность двигателя (л.с.) 4
Тип масла в двигателе 10W-30 10W-40
Объем масла в двигателе 700

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

normalize-space - это функция XPath, а не функция Python или метод объекта Python.Поэтому вам нужно использовать его в выражении XPath, например:

for item in response.xpath('//tr[@itemprop="additionalProperty"]'):
    yield {
        'name': item.xpath('normalize-space(./*[@itemprop="name"])').extract_first(),
        'value': item.xpath('normalize-space(./*[@itemprop="value"])').extract_first()
    }
1 голос
/ 23 апреля 2019

Вам следует рассмотреть возможность использования html-text вместо normalize-space в XPath для достижения своей цели.

>>> from html_text import extract_text
>>> extract_text('''
... <tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">
...               <td class="label_table" itemprop="name">Мощность двигателя (л.с.)</td>
...               <td class="value_table">
...                 <span itemprop="value">4</span>
...               </td>
...             </tr>
... <tr itemprop="additionalProperty" itemscope="" itemtype="http://schema.org/PropertyValue">
...               <td class="label_table" itemprop="name">Тип масла в двигателе</td>
...               <td class="value_table">
...                 <span itemprop="value">10W-30 10W-40</span>
...               </td>
...             </tr>
... ''')
'Мощность двигателя (л.с.) 4\nТип масла в двигателе 10W-30 10W-40'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...