繁体   English   中英

如何处理 Python 中的异常

[英]How do I handle exceptions in Python

这回答了我的问题,问题解决了。 你可以删除这个帖子。

RETRIES = 10

id = None
session = requests.Session()

for attempt in range(1, RETRIES + 1):
    response = session.get(url)
    soup = BeautifulSoup(r.text, "lxml")

    element = soup.find('a', class_="class", id=True)
    if element is None:
        print("Attempt {attempt}. Element not found".format(attempt=attempt))
        continue
    else:
        id = element["id"]
        break

print(id)

这回答了我的问题,问题解决了。 你可以删除这个帖子。

您可以应用“跳前查看”( LBYL )原则并检查find()的结果 - 如果未找到元素,它将返回None 然后,您可以将事物放入循环并在有值时退出,同时使用循环计数器限制来保护自己:

RETRIES = 10

id = None
session = requests.Session()

for attempt in range(1, RETRIES + 1):
    response = session.get(url)
    soup = BeautifulSoup(r.text, "lxml")

    element = soup.find('a', class_="class", id=True)
    if element is None:
        print("Attempt {attempt}. Element not found".format(attempt=attempt))
        continue
    else:
        id = element["id"]
        break

print(id)

情侣笔记:

  • id=True设置为仅查找存在id元素的元素。 您也可以使用CSS 选择器soup.select_one("a.class[id]")
  • Session()有助于在多次向同一主机发出请求时提高性能。 Session 对象中查看更多信息

如果您只想再次发出相同的请求,则可以执行以下操作:

import requests
from bs4 import BeautifulSoup

def find_data(url):
    found_data = False
    while not found_data:
        r = requests.get(url)
        soup = BeautifulSoup(r.text, "lxml")
        try:
            id = soup.find('a', class_="class").get('id')
            found_data = True
        except:
            pass

如果数据确实不存在,这会使您面临无限循环的风险。 您可以这样做以避免无限循环:

import requests
from bs4 import BeautifulSoup

def find_data(url, attempts_before_fail=3):
    found_data = False
    while not found_data:
        r = requests.get(url)
        soup = BeautifulSoup(r.text, "lxml")
        try:
            id = soup.find('a', class_="class").get('id')
            found_data = True
        except:
            attempts_before_fail -= 1
            if attempts_before_fail == 0:
                raise ValueError("couldn't find data after all.")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM