除(python,crawler)之外的可能性

时间:2018-05-23 09:26:34

标签: python

我是一个绝对的初学者,但是有了youtube和一些网站,我已经为德国网站Immoscout24写了一个爬虫。

我的问题:如果所有属性都被删除,爬虫工作正常。但是,如果一个网站没有任何属性(例如" pre" in" beschreibung_container"),我将得到" NameError:name' beschreibung& #39;未定义"。我怎么办,如果属性不存在又继续抓取,它什么都不写(#34;")到我的结果列表(csv)中?

for number in numbers:
my_url = "https://www.immobilienscout24.de/expose/%s#/" %number

uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")

containers = page_soup.find_all("div", {"id":"is24-content"})

filename = "results_"+current_datetime+".csv"
f = open(filename, "a")

headers = "Objekt-ID##Titel##Adresse##Merkmale##Kosten##Bausubstanz und Energieausweis##Beschreibung##Ausstattung##Lage\n"

f.write(headers)

for container in containers:
    try:
        objektid_container = container.find_all("div", {"class":"is24-scoutid__content padding-top-s"})
        objektid = objektid_container[0].get_text().strip()

        titel_container = container.find_all("h1", {"class":"font-semibold font-xl margin-bottom margin-top-m palm-font-l"})
        titel = titel_container[0].get_text().strip()

        adresse_container = container.find_all("div", {"class":"address-block"})
        adresse = adresse_container[0].get_text().strip()

        criteria_container = container.find_all("div", {"class":"criteriagroup criteria-group--two-columns"})
        criteria = criteria_container[0].get_text().strip()

        preis_container = container.find_all("div", {"class":"grid-item lap-one-half desk-one-half padding-right-s"})
        preis = preis_container[0].get_text().strip()

        energie_container = container.find_all("div", {"class":"criteriagroup criteria-group--border criteria-group--two-columns criteria-group--spacing"})
        energie = energie_container[0].get_text().strip()

        beschreibung_container = container.find_all("pre", {"class":"is24qa-objektbeschreibung text-content short-text"})
        beschreibung = beschreibung_container[0].get_text().strip()

        ausstattung_container = container.find_all("pre", {"class":"is24qa-ausstattung text-content short-text"})
        ausstattung = ausstattung_container[0].get_text().strip()

        lage_container = container.find_all("pre", {"class":"is24qa-lage text-content short-text"})
        lage = lage_container[0].get_text().strip()
    except:
        print("some mistake")
        pass

f.write(objektid + "##" + titel + "##" + adresse + "##" + criteria.replace("    ", ";") + "##" + preis.replace("    ", ";") + "##" + energie.replace("    ", ";") + "##" + beschreibung.replace("\n", " ") + "##" + ausstattung.replace("\n", " ") + "##" + lage.replace("\n", " ") + "\n")

f.close()

修改

第一个问题解决了。另一个问题:我的结果列表在每列中显示如下:
look here

我该怎么办?" Objekt-ID"其他标题只在第1行?

2 个答案:

答案 0 :(得分:0)

我认为你需要将每个变量封装在try-except块中。

E.g:

try:
    objektid_container = container.find_all("div", {"class":"is24-scoutid__content padding-top-s"})
    objektid = objektid_container[0].get_text().strip()
except:
    objektid = ""

对所有变量执行此操作

对于第二个问题将标题移到循环外部 删除此代码:

filename = "results_"+current_datetime+".csv"
f = open(filename, "a")

headers = "Objekt-ID##Titel##Adresse##Merkmale##Kosten##Bausubstanz und Energieausweis##Beschreibung##Ausstattung##Lage\n"

f.write(headers)

并在之前添加:

for number in numbers:

答案 1 :(得分:0)

对于每个变量,您只需执行以下操作即可

obj = container.find_all("div", {"class":"xxxxx"}) or ""
objid = obj[0].get_text().strip() if obj else ""

如果find_all返回空列表或没有,则第一行将默认值为""空字符串。第二个也做同样的事情,但先检查是否存在值,然后应用if else条件。