在python中抓取,选择器返回空列表

时间:2019-01-10 17:04:44

标签: python xpath beautifulsoup scrapy

现在已经三天了,我为此折磨了脑筋。因此任何帮助将不胜感激。 遇到我要抓取flipkart.com的问题,我在出现相同问题之前就使用了scrapy,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 :(得分:1)

恐怕您没有注意到您的网站是由javascript渲染的。

如果您希望您的项目成功,有多种方法可以实现。

首先, 找出带来所需数据的network call {API},并在项目中模拟该调用。

其次,使用splash或其他javascript渲染工具在您的响应中获取js rendered html。

答案 1 :(得分:0)

如果使用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