为了账号安全,请及时绑定邮箱和手机立即绑定

我的脚本中存在一些 Python 异常问题

我的脚本中存在一些 Python 异常问题

米琪卡哇伊 2023-03-22 17:19:49
我正在尝试从一些网站上抓取数据以进行概念验证项目。目前使用 Python3 和 BS4 来收集所需的数据。我有一本来自三个站点的 URLS 字典。每个站点都需要不同的方法来收集数据,因为它们的 HTML 不同。我一直在使用“Try, If, Else, stack 但我一直遇到问题,如果你能看看我的代码并帮助我修复它那就太好了!当我添加更多要抓取的站点时,我将无法使用“Try、If、Else”循环通过各种方法来找到抓取数据的正确方法,我如何才能让这段代码面向未来添加未来有多少网站并从其中包含的各种元素中抓取数据?# Scraping Script Here:def job():prices = {    # LIVEPRICES    "LIVEAUOZ":    {"url": "https://www.gold.co.uk/",                           "trader": "Gold.co.uk",                           "metal":  "Gold",                           "type":   "LiveAUOz"},    # GOLD    "GLDAU_BRITANNIA":    {"url": "https://www.gold.co.uk/gold-coins/gold-britannia-coins/britannia-one-ounce-gold-coin-2020/",                           "trader": "Gold.co.uk",                           "metal":  "Gold",                           "type":   "Britannia"},    "GLDAU_PHILHARMONIC": {"url": "https://www.gold.co.uk/gold-coins/austrian-gold-philharmoinc-coins/austrian-gold-philharmonic-coin/",                           "trader": "Gold.co.uk",                           "metal":  "Gold",                           "type":   "Philharmonic"},    "GLDAU_MAPLE":        {"url":    "https://www.gold.co.uk/gold-coins/canadian-gold-maple-coins/canadian-gold-maple-coin/",                           "trader": "Gold.co.uk",                           "metal":  "Gold",                           "type":   "Maple"},    # SILVER    "GLDAG_BRITANNIA":    {"url": "https://www.gold.co.uk/silver-coins/silver-britannia-coins/britannia-one-ounce-silver-coin-2020/",                           "trader": "Gold.co.uk",                           "metal":  "Silver",                           "type":   "Britannia"},    "GLDAG_PHILHARMONIC": {"url": "https://www.gold.co.uk/silver-coins/austrian-silver-philharmonic-coins/silver-philharmonic-2020/",                           "trader": "Gold.co.uk",                           "metal":  "Silver",                           "type":   "Philharmonic"}}
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

为抓取添加一个配置,其中每个配置都是这样的:


prices = {

    "LIVEAUOZ": {

        "url": "https://www.gold.co.uk/",

        "trader": "Gold.co.uk",

        "metal": "Gold",

        "type": "LiveAUOz",

        "price": {

            "selector": '#id > div > table > tr',

            "parser": lambda x: float(re.sub(r"[^0-9\.]", "", x))

        }


    }

}

使用 price 的选择器部分获取 HTML 的相关部分,然后使用解析器函数对其进行解析。


例如


for key, config in prices.items():

    response = requests.get(config['url'])

    soup = BeautifulSoup(response.text, 'html.parser')

    price_element = soup.find(config['price']['selector'])

    if price_element:

        AG_GRAM_SPOT = price_element.get_text()

        # convert to float

        AG_GRAM_SPOT = config['price']['parser'](AG_GRAM_SPOT)

        # etc

您可以根据需要修改配置对象,但对于大多数站点来说它可能非常相似。例如,文本解析很可能总是相同的,所以不用 lambda 函数,而是用 def 创建一个函数。


def textParser(text):

    return float(re.sub(r"[^0-9\.]", "", text))

然后在配置中添加对 textParser 的引用。


prices = {

    "LIVEAUOZ": {

        "url": "https://www.gold.co.uk/",

        "trader": "Gold.co.uk",

        "metal": "Gold",

        "type": "LiveAUOz",

        "price": {

            "selector": '#id > div > table > tr',

            "parser": textParser

        }


    }

}

这些步骤将允许您编写通用代码,保存所有那些尝试异常。


查看完整回答
反对 回复 2023-03-22
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信