2015-06-27 2 views
1

Я пытаюсь читать продукты Amazon в scrapy. Начиная от случайной категории с помощью этого XPath:Scrapy и проблема XPath с вложенными Xpaths

products = Selector(response).xpath('//div[@class="s-item-container"]') 
for product in products: 
    item = AmzItem() 
    item['title'] = product.xpath('//a[@class="s-access-detail-page"]/@title').extract()[0] 
    item['url'] = product.xpath('//a[@class="s-access-detail-page"]/@href').extract()[0] 
    yield item 

('//div[@class="s-item-container"]') возвращает все дивы с продуктами на одной странице категории - это правильно.

Теперь, как бы я получил ссылку на продукт?

// обозначает где-либо в коде с @CLASS должны выбрать правильный класс Но я получаю:

item['title'] = product.xpath('//a[@class="s-access-detail-page"]/@title').extract()[0] exceptions.IndexError: list index out of range

Так что мой список соответствия этого XPath должен быть пустым - но Я не понимаю, почему?

EDIT:
HTML, будет выглядеть так:

<div class="s-item-container" style="height: 343px;"> 
<div class="a-row a-spacing-base"> 
    <div class="a-column a-span12 a-text-left"> 
     <div class="a-section a-spacing-none a-inline-block s-position-relative"> 
      <a class="a-link-normal a-text-normal" href="http://rads.stackoverflow.com/amzn/click/B0105S434A"><img alt="Product Details" src="http://ecx.images-amazon.com/images/I/41%2BzrAY74UL._AA160_.jpg" onload="viewCompleteImageLoaded(this, new Date().getTime(), 24, false);" class="s-access-image cfMarker" height="160" width="160"></a> 
      <div class="a-section a-spacing-none a-text-center"> 
       <div class="a-row a-spacing-top-mini"> 
        <a class="a-size-mini a-link-normal a-text-normal" href="http://rads.stackoverflow.com/amzn/click/B0105S434A"> 
         <div class="a-box"> 
          <div class="a-box-inner a-padding-mini"><span class="a-color-secondary">See more choices</span></div> 
         </div> 
        </a> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
<div class="a-row a-spacing-mini"> 
    <div class="a-row a-spacing-none"> 
     <a class="a-link-normal s-access-detail-page a-text-normal" title="Harry Potter Gryffindor School Fancy Robe Cloak Costume And Tie (Size S)" href="http://rads.stackoverflow.com/amzn/click/B0105S434A"> 
      <h2 class="a-size-base a-color-null s-inline s-access-title a-text-normal">Harry Potter Gryffindor School Fancy Robe Cloak Costume And Tie (Size S)</h2> 
     </a> 
    </div> 
    <div class="a-row a-spacing-mini"><span class="a-size-small a-color-secondary">by </span><span class="a-size-small a-color-secondary">Legend</span></div> 
</div> 
<div class="a-row a-spacing-mini"> 
    <div class="a-row a-spacing-none"><a class="a-size-small a-link-normal a-text-normal" href="http://rads.stackoverflow.com/amzn/click/B0105S434A"><span class="a-size-base a-color-price a-text-bold">$28.99</span><span class="a-letter-space"></span>new<span class="a-letter-space"></span><span class="a-color-secondary">(1 offer)</span><span class="a-letter-space"></span><span class="a-color-secondary a-text-strike"></span></a></div> 
</div> 
<div class="a-row a-spacing-none"><span name="B0105S434A"> 
    <span class="a-declarative" data-action="a-popover" data-a-popover="{&quot;max-width&quot;:&quot;700&quot;,&quot;closeButton&quot;:&quot;false&quot;,&quot;position&quot;:&quot;triggerBottom&quot;,&quot;url&quot;:&quot;/review/widgets/average-customer-review/popover/ref=acr_search__popover?ie=UTF8&amp;asin=B0105S434A&amp;contextId=search&amp;ref=acr_search__popover&quot;}"><a href="javascript:void(0)" class="a-popover-trigger a-declarative"><i class="a-icon a-icon-star a-star-4"><span class="a-icon-alt">3.9 out of 5 stars</span></i><i class="a-icon a-icon-popover"></i></a></span></span> 
    <a class="a-size-small a-link-normal a-text-normal" href="http://rads.stackoverflow.com/amzn/click/B0105S434A">48</a> 
</div> 
</div> 
+0

Просьба опубликовать фрагмент соответствующего HTML-кода. – unutbu

ответ

1

//a[@class="s-access-detail-page"] требует, чтобы быть точно class="s-access-detail-page", потому что XPath работает со строкой, но не со смыслом:) Когда у вас есть «многоклассный», используйте contains функция

//a[contains(concat(' ', @class, ' '), " s-access-detail-page ")]/@title 
+0

Мне пришлось удалить часть concat - иначе я получаю только 'exceptions.ValueError: Invalid XPath' - но теперь он работает. У вас есть еще одна проблема - не уверен, что это происходит из этого Xpath или sth. иначе - я буду продолжать рыть. – Chris

+0

Если вы тщательно выполнили кавычки, это может быть проблема реализации xpath :( – splash58

+0

Получил это сейчас в нескольких областях - спасибо за то, что указал мне в правильном направлении с содержащими. – Chris

2

Оно должно быть:

# ------------- The dot makes the query relative to product 
product.xpath('.//a[@class="s-access-detail-page"]/@title') 
+0

Нет - я все еще получаю пустой список с этой версией. Но я добавил, что мой HTML может помочь? – Chris

+0

Хорошо, позвольте мне проверить, что – hek2mgl

+0

'a @ class =" s-access-detail-page "' не является дочерним элементом 'div @ class =" s-item-container "' .. Разве это не очевидно? – hek2mgl

Смежные вопросы