WebHU - Programozási kérdések és válaszok

InvalidSelector hiba történt a Selenium web-illesztőprogram termékneveinek lekérésekor

Egy e-kereskedelmi oldalon próbálom megtalálni egy termék nevét és árát. Seleniumot használok, és a kódom:

        for element in WebDriverWait(self.driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '.product-iWrap'))):
            product_name_tmall = element.find_element_by_css_selector('.productTitle a')
            product_price_tmall = element.find_element_by_css_selector('.productPrice em::text')
            tmallSpider.items['product_name_tmall'] = product_name_tmall
            tmallSpider.items['product_price_tmall'] = product_price_tmall
            yield tmallSpider.items

Amikor futtatom, ez a hibaüzenet jelenik meg

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified

Korábban a scrapy-t használtam ugyanazzal a css választóval, és a megfelelő információkat adja:

product_info = response.css('.product-iWrap')
        for product in product_info:
            product_name_tmall = product.css('.productTitle a').xpath('normalize-space(.)').get()
            product_price_tmall = product.css('.productPrice em::text').extract()
            tmallSpider.items['product_name_tmall'] = product_name_tmall
            tmallSpider.items['product_price_tmall'] = product_price_tmall
            product_detail_link = 'http:' + product.css('a::attr(href)')[0].extract()
            yield scrapy.Request(product_detail_link, callback=self.start_scraping)

Nem tudom, miért nem működik a css elérési út a Seleniumban. Az oldal HTML-kódja:

<div class="product-iWrap">
    <p class="productPrice">
        <em title="6599" data=spm-anchor-id="a220m.1000858.100725 ..." class>...</em>
    </p>
    <p class="productTitle">
        <a href="//detail.tmall..." target="blank" title="iPad Air 3"...>...</a>
    </p>
</div>

Ehhez a termékhez a 6599-et és az iPad Air 3-at szeretném beszerezni, valamint az összes termék információit az első oldalon. Van ötleted, hogyan kell csinálni? Ez az oldal URL-je: https://list.tmall.com/search_product.htm?q=ipad


  • megosztanád az oldal URL-jét? 16.07.2020
  • Ha információt szeretne választani az összes termékről, használja a FindElements szelént és tárolja azt 16.07.2020
  • @JustinLambert list.tmall.com/search_product.htm?q=ipad 16.07.2020
  • szeretne Ipad-en keresni, és megkapja az összes terméket? 16.07.2020
  • Csak termékek az első oldalon. A keresés különböző bemeneteket tartalmazna. De az iPad is ezek közé tartozik 16.07.2020
  • stackoverflow.com/questions/44182821/ ez a link segít megoldani a problémát 16.07.2020

Válaszok:


1

Érvénytelen CSS-választót próbál használni. A ::text pszeudoválasztó nem része egyetlen tényleges CSS-specifikációnak sem. Lehetséges, sőt valószínű, hogy a Scrapy támogatja azokat a szelektorokat, amelyek nem részei a CSS szabványnak. A jQuery korábban ugyanezt tette, és a nem szabványos kiválasztó támogatás nem kis zavart okozott a Selenium-felhasználókban, mivel a Selenium csak a CSS azon részeihez tapad, amelyeket a böngésző natív választómotorja támogat.

Mellékesen megjegyzem, ha CSS-választót használ, és nem biztos abban, hogy helyes-e, akkor nyissa meg a böngésző fejlesztői eszközeit, és lépjen a JavaScript-konzolra. Írja be a document.querySelector("<put your selector here>") parancsot, és nyomja meg az Enter billentyűt. Ha az utasítás egy elemet ad vissza, akkor képesnek kell lennie a szelén kódban a választó használatára. Ha nem, akkor nem fogja tudni sikeresen használni.

Ebben a konkrét esetben valami ilyesmit tennék:

for element in WebDriverWait(self.driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '.product-iWrap'))):
    product_name_tmall = element.find_element_by_css_selector('.productTitle a')
    product_price_tmall = element.find_element_by_css_selector('.productPrice em')
    tmallSpider.items['product_name_tmall'] = product_name_tmall.get_attribute('title')
    tmallSpider.items['product_price_tmall'] = product_price_tmall.get_attribute('title')
    yield tmallSpider.items
16.07.2020
  • Csodálatos magyarázat @JimEvans 16.07.2020
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..