Python Scrapy-抓取dt和dd值



我正在尝试获取网站上dt/dd表结构中的所有数据。

我当前的代码如下:

# -*- coding: utf-8 -*-
import scrapy

class KonzumTestSingleSpider(scrapy.Spider):
name = "konzum_test_single"
start_urls = ["https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik"]
def parse(self, response):
dt_list = response.xpath("//*[@id='content-start']//section//dl/dt")
for dt in dt_list:
productTable = {}

productTable["Opisna_tablica"] = dt.xpath("./text()").extract_first(default="").strip()
productTable["ddValue"] = dt.xpath("./following-sibling::dd/text()").extract_first(default="").strip()
yield productTable

这在某种程度上是";正确但不是期望的输出";。我想要的输出将是下面的数据,但在一个请求中返回,并且由于某种原因,如果我正确读取调试数据,Scrapy将在多个请求中退还数据。

2020-08-09 23:23:16 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik> (referer: None)
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Naziv proizvoda', 'ddValue': 'Miješano mljeveno meso. Mljeveno meso.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Neto količina', 'ddValue': '850 g'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Sastojci / Sastav:', 'ddValue': 'juneće meso 50%, svinjsko meso 49%, sol. Postotak masti manji od 30%. Omjer kolagena i bjelančevina mesa manji od 18%.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Dodatne informacije', 'ddValue': 'Pakirano u kontroliranoj atmosferi.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Upute za upotrebu/pripremu', 'ddValue': 'Proizvod termički obraditi prije konzumacije.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Uvjeti čuvanja', 'ddValue': 'Čuvati na temperaturi do +2 C.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Zemlja podrijetla (mjesto podrijetla)', 'ddValue': 'Zemlja rođenja: EU, Zemlja uzgoja: Hrvatska, Zaklano u: Hrvatska HR10EU, Zemlja rasijecanja: Hrvatska HR10EU
, Proizvedeno u: R.Hrvatska.'}
2020-08-09 23:23:16 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'Opisna_tablica': 'Odgovorna osoba / Stavlja ne tržište:', 'ddValue': 'PIK Vrbovec plus d.o.o., Zagrebačka 148, 10340 Vrbovec, Hrvatska.'}

这就是网站的样子:

<section data-toggle-section="animate" class="">
<div data-toggle-trigger="" class="">
<h3 class="b-bottom-space-gray-light fs-echo-gamma color-space-gray-dark py-05 f-weight-bold">
Opis proizvoda
</h3>
<dl class="">
<dt class="xh-highlight">Naziv proizvoda</dt>
<dd class="">Miješano mljeveno meso. Mljeveno meso.</dd>
<dt class="xh-highlight">Neto količina</dt>
<dd class="">850 g</dd>
</dl>
</div>
<div data-toggle-target="" style="display: none;" class="">
<dl class="">
<dt class="xh-highlight">Sastojci / Sastav:</dt>
<dd class="">juneće meso 50%, svinjsko meso 49%, sol. Postotak masti manji od 30%. Omjer kolagena i bjelančevina mesa manji od 18%.</dd>
<dt class="xh-highlight">Dodatne informacije</dt>
<dd class="">Pakirano u kontroliranoj atmosferi.</dd>
<dt class="xh-highlight">Upute za upotrebu/pripremu </dt>
<dd class="">Proizvod termički obraditi prije konzumacije.</dd>
<dt class="xh-highlight">Uvjeti čuvanja </dt>
<dd class="">Čuvati na temperaturi do +2 C.</dd>
<dt class="xh-highlight">Zemlja podrijetla (mjesto podrijetla)</dt>
<dd class="">Zemlja rođenja: EU, Zemlja uzgoja: Hrvatska, Zaklano u: Hrvatska HR10EU, Zemlja rasijecanja: Hrvatska HR10EU, Proizvedeno u: R.Hrvatska.</dd>
<dt class="xh-highlight">Odgovorna osoba / Stavlja ne tržište:</dt>
<dd class="">PIK Vrbovec plus d.o.o., Zagrebačka 148, 10340 Vrbovec, Hrvatska.</dd>
</dl>
</div>
<button data-toggle-trigger="" type="button" class="t-center fs-base w-100 p-1">
<i class="fas fa-chevron-down"></i>
</button>
</section>

编辑:当我从产量中删除一个缩进级别时,我得到了这个:

2020-08-10 00:13:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.konzum.hr/web/products/mijesano-mljeveno-meso-pakirano-850-g-pik>
{'dtValue': 'Odgovorna osoba / Stavlja ne tržište:', 'ddValue': 'PIK Vrbovec plus d.o.o., Zagrebačka 148, 10340 Vrbovec, Hrvatska.'}

现在,我只得到一个结果。

我不确定你想要什么,但这将返回一个包含所有字段的项目:

productTable = {}        
for dt in dt_list:        
field = dt.xpath("./text()").extract_first(default="").strip()
value = dt.xpath("./following-sibling::dd/text()").extract_first(default="").strip()
productTable[field] = value 
yield productTable

既然可以直接获取所有值,为什么要使用循环?此外,您还可以大大缩短XPath:

dt = response.xpath('//dt/text()').getall()
dd = response.xpath('//dd/text()').getall()
data = dict(zip(dt, dd))

最新更新