выскабливание в python, селектор возвращает пустой список - PullRequest
0 голосов
/ 10 января 2019

Вот уже 3 дня я мучаю свой мозг ради этого. поэтому любая помощь будет принята с благодарностью. Что касается проблемы, которую я хочу очистить flipkart.com, я использовал скрап до того, как возникнет та же проблема, s

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

url = 'https://www.flipkart.com/offers-list/top-selling-mobiles?screen=dynamic&pk=themeViews%3DTopsellers-Mobiles-March18%3ADesk~widgetType%3DdealCard~contentType%3Dneo&wid=8.dealCard.OMU&otracker=clp_omu_Top%2BSelling%2BMobiles_mobile-phones-store_7'
uclient = ureq(url)
page_html = uclient.read()
uclient.close()
page_soup = soup(page_html, 'html.parser')
container = page_soup.find_all("div", {"class":"MDGhAp"})
Контейнер

должен возвращать кучу объектов вместо пустого списка. Я хочу нажать на каждый смартфон, чтобы текст можно было извлечь. что я делаю не так, кто-нибудь может догадаться.

Ответы [ 2 ]

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

Боюсь, вы не заметили, что ваш сайт отображается с помощью javascript.

Если вы хотите, чтобы ваш проект был успешным, есть несколько способов сделать это.

Во-первых, Найдите network call {API}, который приносит нужные данные, и макет этого вызова в вашем проекте.

Во-вторых, используйте splash или другие инструменты рендеринга JavaScript, чтобы получить js rendered html в своем ответе.

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

Если вы перейдете с Selenium, он вернет обратно 12 элементов в контейнер.

import bs4 
from selenium import webdriver 


url = 'https://www.flipkart.com/offers-list/top-selling-mobiles?screen=dynamic&pk=themeViews%3DTopsellers-Mobiles-March18%3ADesk~widgetType%3DdealCard~contentType%3Dneo&wid=8.dealCard.OMU&otracker=clp_omu_Top%2BSelling%2BMobiles_mobile-phones-store_7'

browser = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
browser.get(url)

html = browser.page_source
page_soup = bs4.BeautifulSoup(html,'html.parser')

container = page_soup.find_all("div", {"class":"MDGhAp"})

Теперь вы можете начать извлекать текст из каждого элемента:

for element in container:
    print(element.text.strip())

Выход:

Asus Zenfone Max Pro M2Upto 6GB RAM|64GB ROMFrom ₹12,999
Redmi Note 6 ProUpto 6GB RAM|64GB ROMFrom ₹13,999
Realme C16.2" Notch DisplayNow ₹7,499
Asus Zenfone Max M2Upto 4GB RAM|64GB ROMFrom ₹9,999
Honor 9N13MP+2MP |16MP CameraFrom ₹8,999
Realme 2 Pro3500 mAh BatteryFrom ₹13,990
Nokia 5.1 Plus 13MP+5MP | 8MP CameraNow ₹9,999
Realme 2Upto 4GB RAM|64GB ROMFrom ₹8,990
Google Pixel 35.5" FHD+ DisplayFrom ₹71,000
Redmi 612MP+5MP|5MP CameraFrom ₹8,499
Samsung Galaxy On64 GB RAM | 64 GB ROMNow ₹12,990
Nokia 6.1 Plus (4GB, 64 GB) 16MP+5MP Rear CameraNow ₹14,999
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...