【问题标题】:How can i get my webscraper to skip over information I cant parse so it doesn't break.?我怎样才能让我的网络爬虫跳过我无法解析的信息,这样它就不会中断。?
【发布时间】:2020-09-28 18:15:18
【问题描述】:

我已经创建了这个网络爬虫,当它运行时它会中断,因为如果它不能解析某些信息,我没有规则可以继续运行。我正在获取房地产经纪人的姓名和电话号码,但并不是每个人的网站上都有他们的电话号码,当我遇到没有电话号码的房地产经纪人时,脚本将停止工作并返回错误。我是这方面的初学者,如果找不到所需的信息,我找不到正确的方法让它在页面之间保持循环。它只是在找不到更多信息时停止。我知道这是一个菜鸟问题,但对于我的生活,我无法让它继续运行错过的信息。

import requests
from requests import get
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup 
import numpy as np
from numpy import arange

from time import sleep
from random import randint

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

my_url = 'https://www.realtor.com/realestateagents/phoenix_az/pg-2'

#opening up connection, grabbing the page
uClient = uReq(my_url)
#read page 
page_html = uClient.read()
#close page
uClient.close()

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

for page in pages:

    page = requests.get("https://www.realtor.com/realestateagents/phoenix_az/pg-2" + str(page) + "&ref_=adv_nxt", headers=headers)


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

sleep(randint(2,10))

#finds all realtors on page 
containers = page_soup.findAll("div",{"class":"agent-list-card clearfix"})

for container in containers:
    name = container.find('div', class_='agent-name text-bold')
    agent_name = name.text.strip()

    number = container.find('div', class_='agent-phone hidden-xs hidden-xxs')
    agent_number = number.text.strip()


print("name: " + agent_name)
print("number: " + agent_number)

以下是我为尝试解决此问题而编写的规则,但我对此并不擅长,也不完全确定我哪里出错了。

nv = container.find_all('div', attrs={'number': 'nv'})
number = nv[1].text if len(nv) > 1 else '-'

【问题讨论】:

标签: python python-3.x web web-scraping


【解决方案1】:

您需要了解 tryexcept 块以捕获错误而不是介于两者之间。

for container in containers:
    try:
        name = container.find('div', class_='agent-name text-bold')
        agent_name = name.text.strip()
    except:
        pass
    try:
        number = container.find('div', class_='agent-phone hidden-xs hidden-xxs')
        agent_number = number.text.strip()
    except:
        pass

这是有关如何使用它的基本示例。但是只写except 将捕获您可能遇到的所有错误。您需要查看您看到的错误以捕获它们。仅供参考,不推荐这种使用 except 的方式,但是您仍然可以使用它。 更好的方法是使用 except 您要处理的异常。例如,如果要处理属性错误,请使用与以下相同的代码:

for container in containers:
    try:
        name = container.find('div', class_='agent-name text-bold')
        agent_name = name.text.strip()
    except AttributeError:
        pass
    try:
        number = container.find('div', class_='agent-phone hidden-xs hidden-xxs')
        agent_number = number.text.strip()
    except AttributeError:
        pass

您也可以选择使用if-else。如果条件为真,则打印名称和编号,否则您可以在else 块中设置另一个条件。 祝你好运。

【讨论】:

  • 谢谢哈姆扎!最终目标是将所有这些信息导出到 csv 文件中。我暂时只收集姓名和号码。如果我浏览 35 页信息,您认为最好使用哪条规则?再次感谢!
  • 我建议try-except。我一直像其他人一样使用它,无论页数如何。这真的取决于你每次想做什么。
  • 好的,我相信除了设置之外我已经尝试过了,但是现在我得到了一个预期的缩进块错误。
  • try: name = container.find('div', class_='agent-name text-bold') agent_name = name.a.text.strip() except AttributeError: print("-" )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多