Python刮削dt和dd值

2024-06-01 00:55:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在网站上获取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.'}

现在,我只得到一个结果


Tags: httpswebwwwdthrddclassproducts
2条回答

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

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

相关问题 更多 >