Scrapy-在项目列表中使用“规范化空间”

时间:2019-04-23 10:30:42

标签: python scrapy

试图从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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

您应该考虑使用html-text而非XPath的normalize-space来实现目标。

>>> 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'