【问题标题】:beautiful soup scrape multi page missing value on next page漂亮的汤在下一页刮多页缺失值
【发布时间】:2020-10-03 05:32:01
【问题描述】:

我正在使用 Beautifulsoup 在多页网站上抓取汽车名称和价格列表。在一页中,它包含 40 个数据,如果只抓取一页,代码就可以正常工作。刮多页时(本例只刮两页检查代码是否正常),发现下一页开头(“价格”列)总是缺少数据,这使得数据是从数据 41 开始没有正确对齐。

关于价格列数据的一些注释:列出的价格可以是 ('ads_price_highlight') 或 ('ads_price'),作为折扣价。

下面是我为这种情况创建的解析多页的代码。我仍然不知道为什么我在价格列上得到了这个缺失的数据,而另一列是正确的。

from bs4 import BeautifulSoup
import pandas as pd
import requests
import numpy as np

from time import sleep
from random import randint

headers = {"Accept-Language": "en-US, en;q=0.5"}

car = []
price = []

pages = np.arange(1,3,1)

for page in pages:

  url = 'https://www.mudah.my/malaysia/cars-for-sale/perodua?o='+ str(page) +'&q=&so=1&th=1'
  page = requests.get(url, headers=headers)

  soup = BeautifulSoup(page.text, 'html.parser')
  car_list = soup.find_all('li', class_='listing_ads_params')

  sleep(randint(2,10))

  for container in car_list:
        cars = container.find('div', {'class':'top_params_col1'})
        if cars is not None:
            car.append(cars.find('h2', {'class': 'list_title'}).text)   

        prices2 = container.find('div', class_='ads_price_highlight')
        if prices2 is not None:
            price.append(prices2.text)

        prices = container.find('div', class_='ads_price')
        if prices is not None:
            price.append(prices.text)

df = pd.DataFrame(data = list(zip(car, price)),
                    columns = ['car', 'price'])

df.to_csv(r'carprice.csv', index = False)

【问题讨论】:

    标签: python web-scraping beautifulsoup html-parsing


    【解决方案1】:

    有两件事发生:

    1.) 标准的html.parser 不能很好地解析这个页面,使用lxmlhtml5lib

    2.) 该页面在带有class="honey-pot" 的常规广告之间有“虚拟”广告列表,因此脚本需要处理它们。

    例如:

    import requests
    from bs4 import BeautifulSoup
    
    
    url = 'https://www.mudah.my/malaysia/cars-for-sale/perodua?o={page}&q=&so=1&th=1'
    headers = {"Accept-Language": "en-US, en;q=0.5"}
    
    for page in range(1, 3):
        soup = BeautifulSoup(requests.get(url.format(page=page), headers=headers).content, 'lxml')
    
        for title, price in zip(soup.select('#list-view-ads .list_ads:not(.honey-pot) .list_title'),
                                soup.select('#list-view-ads .list_ads:not(.honey-pot) div[class^="ads_price"]')):
            print('{:<60}{}'.format(title.get_text(strip=True), price.get_text(strip=True)))
    

    打印:

    Ladies Owner/SE B.Kit-2008 Perodua MYVI 1.3 EZ (A)          RM 15 800
    Perodua MYVI 1.3 EZ (A) LIMETED EDITION                     RM 16 800
    Perodua MYVI 1.3 SX FACELIFT (M)                            RM 10 990
    Perodua VIVA 1.0 (A) ONE OWNER ACC FREE                     RM 9 800
    Perodua KELISA 1.0 SE EZS (A) Jaga Baik                     RM 13 990
    Perodua MYVI 1.3 EZi (A) PASSO RACY~17" RIMS                RM 22 990
    Perodua MYVI 1.3 (A) EZi tru 2007                           RM 14 800
    23k KM SUPER CARKING 2010 Perodua MYVI 1.3 EZ (A)           RM 16 800
    Perodua MYVI 1.3(M) SX 1 owner Ori mielage                  RM 10 800
    Perodua MYVI H/AV 1.5L (A) R3Bat3 2XXX                      RM 50 600
    Perodua ARUZ X 1.5L (A) R3BaT3 2XXX                         RM 72 600
    Perodua AXIA GXTRA R3BAT3 1XXX                              RM 35 300
    
    ...and so on.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 2012-08-01
      • 2017-10-16
      • 2013-11-08
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多