如果源格式不一致,如何使用BeautifulSoup刮取不同的页面?

时间:2017-03-20 01:40:54

标签: python-2.7 web-scraping beautifulsoup

我想从页面结构变化的几个页面中抓取数据,而不是完全不同,但不完全相同。我的代码只遍历len(d)== 7并跳过其他的所有页面,其中d是d = soup.findAll('span',class _ ='property _base-info__value')。 我如何获得所有页面?!是否有可能引入页面上不存在的变量然后给它们NA值?! 这是我的代码:

A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
H=[]
I=[]
J=[]
K=[]
L=[]

url =   

['https://www.booli.se/annons/2272818','https://www.booli.se/annons/2082826'] 

import requests
from bs4 import BeautifulSoup

for page in url: 
    request = requests.get(page)
    soup = BeautifulSoup(request.text,'lxml')
    #
    d = soup.findAll('span', class_='property__base-info__value')
    if len(d)==7:
        #
        region=soup.findAll('span', itemprop='name')   
        [1].text.strip().encode('utf-8')  ###region###
        #
        a = soup.findAll('span', class_='property__base-info__title__size')
        ar = a[0].text.strip().encode('utf-8').split()
        room=ar[0]  ######Rooms#####
        area=ar[2]  #####Area#####
        #
        temp=[]
        d = soup.findAll('span', class_='property__base-info__value')
        for i in d:
            i = i.text.strip()
            temp.append(i)
        #
        full_date=temp[0].encode('utf-8')
        import datetime as dt
        date=dt.datetime.strptime(full_date, '%d %b %Y').strftime('%Y-%m-%d')    
        #
        tempo = temp[1].split('\n')[0].encode('utf-8')
        Utropspris=tempo.replace('kr','')
        import re
        estimate=re.sub(r'(\d)\s+(\d)', r'\1\2', Utropspris) 
        #
        avgift=temp[2].encode('utf-8').replace('kr/m\xc3\xa5n','')
        fee=re.sub('(?<=\d) (?=\d)', '',avgift) ####avgift####
        #
        apt=[]
        lag=temp[3].encode('utf-8')
        if lag=='L\xc3\xa4genhet':
            apt='apartment'        ######Property type##########
        #
        cost=temp[4].encode('utf-8').replace('kr/m\xc3\xa5n','') 
        #
        floor=temp[5].encode('utf-8').replace('tr','')  
        #
        year=temp[6].encode('utf-8')   ###Year built####
        #
        test=soup.find('span', class_='property__base-info__sub- 
        value').text.strip().encode('utf-8').replace('kr/m\xc2\xb2','')
        krm2=re.sub('(?<=\d) (?=\d)', '',test)   
        #
        main=soup.find('span', class_='property__base- 
        info__title__price').text.strip().split('\n')[0].encode('utf- 
        8').replace('kr','')
        price=re.sub('(?<=\d) (?=\d)', '',main)  ####sold price####
        #
        A.append(region)
        B.append(room)
        C.append(area)
        D.append(date)
        E.append(estimate)
        F.append(fee)
        G.append(apt)
        H.append(cost)
        I.append(floor)
        J.append(year)
        K.append(krm2)
        L.append(price)

更新(来自自我回答)

我可以改变限制。但它不会给我正确的输出。 len(d)==7用于获取所有内容的完整信息。如果我把它设置为五,我可能得到一个房子:

room, area, cost(Driftskostnad), floor (Våning),estimated price (Utropspris)

和另一所房子:

room, area, fee (avgift), year built (Byggår), estimated price (Utropspris)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您要求抓取您不确定存在的数据。 计算机是宇宙中最愚蠢的东西。

你说你的代码 ONLY 经过len(d)== 7的页面。你能设定另一个限制吗?

  

是否可以引入页面上不存在的变量   然后给他们NA值?!

是的,您可以使用简单if VARIABLE==None:或仅if Variable:检查元素(字段)是否存在(如果有任何数据应该返回true) 希望这能回答你的问题。您需要了解一些细节,以便我正确回答问题,编辑您的问题并做出回应。