Невозможно удалить контейнеры с веб-страниц - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь попрактиковаться в удалении веб-страниц из электронной коммерции. Я определил имя класса контейнера (ячейка, в которой содержится каждый продукт) как 'c3e8SH'. Затем я использовал следующий код для удаления всех контейнеров на этой веб-странице. После этого я использовал len(containers), чтобы проверить количество контейнеров на веб-странице.

Однако, он вернул 0. Может кто-то указать, что я делаю неправильно? Большое спасибо!

import bs4
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.lazada.sg/catalog/?spm=a2o42.home.search.1.488d46b5mJGzEu&q=switch%20games&_keyori=ss&from=search_history&sugg=switch%20games_0_1'

# opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html, 'html.parser')

#grabs each product
containers = page_soup.find_all('div', class_='c3e8SH')
len(containers)

screenshot of element inspection

Ответы [ 3 ]

0 голосов
/ 22 января 2019

(1) Во-первых, param cookies is needed.

Вы будете get the validation page, как показано ниже, если вы только запросите ссылку without cookies

https://www.lazada.sg/catalog/?spm=a2o42.home.search.1.488d46b5mJGzEu&q=switch%20games&_keyori=ss&from=search_history&sugg=switch%20games_0_1

enter image description here



(2) во-вторых, страница, которую вы хотите очиститьэто dynamicly loaded

Вот почему то, что вы видите через веб-браузер, отличается от того, что вы получаете по кодам

для удобства, я бы предпочел использовать requestsmodule.


import requests


my_url = 'https://www.lazada.sg/catalog/?spm=a2o42.home.search.1.488d46b5mJGzEu&q=switch%20games&_keyori=ss&from=search_history&sugg=switch%20games_0_1'


cookies = {
    "Hm_lvt_7cd4710f721b473263eed1f0840391b4":"1548133175,1548135160,1548135844",
    "Hm_lpvt_7cd4710f721b473263eed1f0840391b4":"1548135844",
    "x5sec":"7b22617365727665722d6c617a6164613b32223a223862623264333633343063393330376262313364633537653564393939303732434c50706d754946454e2b4b356f7231764b4c643841453d227d",
}

ret = requests.get(my_url, cookies=cookies)
print("New Super Mario Bros" in ret.text) # True 

# then you can get a json-style shop-items in ret.text  


Товары в магазине, такие как:

item_json = 

    {
        "@context":"https://schema.org",
        "@type":"ItemList",
        "itemListElement":[
            {
                "offers":{
                    "priceCurrency":"SGD",
                    "@type":"Offer",
                    "price":"72.90",
                    "availability":"https://schema.org/InStock"
                },
                "image":"https://sg-test-11.slatic.net/p/ae0494e8a5eb7412830ac9822984f67a.jpg",
                "@type":"Product",
                "name":"Nintendo Switch New Super Mario Bros U Deluxe",  # item name
                "url":"https://www.lazada.sg/products/nintendo-switch-new-super-mario-bros-u-deluxe-i292338164-s484601143.html?search=1"
            },
            ... 

        ]

    }

, как показали данные json, вы можете получить название любого элемента, URL-ссылку, цена и пр.


0 голосов
/ 23 января 2019

Я попытался найти c3e8SH в предложенном вами документе с regex, но я не смог найти такое имя класса.Пожалуйста, проверьте ваш документ еще раз.

0 голосов
/ 22 января 2019

Попробуйте использовать другой парсер.Я рекомендую lxml.Таким образом, ваша строка, в которой вы создаете page_soup, будет выглядеть так: page_soup = soup(page_html, 'lxml')

...