Как предотвратить ошибку, когда webscraping с python и значение не существует? - PullRequest
0 голосов
/ 21 февраля 2019

Прямо сейчас я пытаюсь просмотреть сайт недвижимости и почистить данные о недвижимости.У меня есть код, который просматривает список свойств, получает данные, а затем переходит на страницу для каждого свойства и получает более подробные данные.Это работает, но проблема в том, что если какое-либо поле отсутствует, я получаю ошибку, которая вызывает исключение и заставляет его перейти к следующему свойству.Вместо этого я хотел бы, чтобы он просто устанавливал нулевое значение для любых отсутствующих данных, которые я новичок в Python и веб-скрепинге, так что может быть больше понимания того, как очистить мой код, так что не стесняйтесь комментировать это, но в основном я »Я просто пытаюсь заставить его положить нули, где он находит недостающие данные.Вот код, где prop_list является HTML-кодом для

for item in prop_list:
    try:
        d ={}
        d["address"] = item.find("span", {"itemprop":"streetAddress"}).text
        d["city"] = item.find("span", {"itemprop":"addressLocality"}).text
        d["state"] = item.find("span", {"itemprop":"addressRegion"}).text
        d["zip_code"] = item.find("span", {"itemprop":"postalCode"}).text
        d["price"] = item.find("span", {"class":"data-price"}).text
        d["lot_sqft"] = item.find("li", {"data-label":"property-meta-lotsize"}).find("span", {"class":"data-value"}).text           
        link = item.find("a").get("href")
        url = "https://www.realtor.com" + link
        d["url"] = url
        d["longitude"] = item.find("meta",{"itemprop":"longitude"}).get("content")
        d["latitude"] = item.find("meta",{"itemprop":"latitude"}).get("content")
        desc_link = requests.get(url,headers=headers)
        b = desc_link.content
        temp = BeautifulSoup(b,"html.parser")
        d["description"] = temp.find("p", {"class": "word-wrap-break"})
        d["year_built"] = temp.find("li", {"data-label": "property-year"}).find("div", {"class":"key-fact-data ellipsis"}).text

        l.append(d)

    except:
        print("exception occurred")

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Поскольку вы новичок, я бы разработал ваш код таким образом.Просто используйте оператор if-else, подобный следующему:

if item.find("span", {"itemprop" : "streetAddress"}):
    d["address"] = item.find("span", {"itemprop":"streetAddress"}).text
else:
    d["address"] = "" # or None

Теперь делать так для каждого элемента было бы беспокойно, поэтому в Pythonic:

d["address"] = item.find("span", {"itemprop":"streetAddress"}).text if item.find("span", {"itemprop":"streetAddress"}) else ""

Это даст вам точночто тебе нужно.

0 голосов
/ 21 февраля 2019

Я предполагаю, что если вы не нашли определенный элемент, то попытка получить elem.text из него приведет к исключению.Если это так, то вы можете сделать это:

d["address"] = item.find("span", {"itemprop":"streetAddress"}).text if item.find("span", {"itemprop":"streetAddress"}) else "-"

или другим способом избежать исключения, но таким образом вы не можете установить значение по умолчанию, например "-":

d["address"] = item.find("span", {"itemprop":"streetAddress"}) and item.find("span", {"itemprop":"streetAddress"}).text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...