对beautifulsoup中缺少字段的错误处理

2024-04-26 13:59:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用Beautifulsoup抓取一些页面时遇到了很多错误,主要是因为有些页面在HTML中有一些细微的差异,或者确实缺少字段。你知道吗

我正在寻找一个干净的方法来处理这些,但我还没有找到一个在文件或在另一个问题。我目前正在用try来处理这个问题,因为如果缺少一个字段,我仍然希望检索其余字段。你知道吗

try:
    address = house.find(text=re.compile('[0-9]{4}[ ]?[azAZ]{2}'))
except:
    address = "ERR No Address"

然而,这导致了许多try-except子句,我想知道在保持代码可读性的同时,如何更好地处理这个问题?你知道吗

编辑:针对凯文的回答:函数确实是我想要的,但我有以下问题:

考虑到可扩展性,我将如何利用这个函数生成一个不仅接受上述find调用,而且还接受任何find调用的函数?我需要捕获以下调用,例如:

house.find("a", class_='object-street').text)
house.find("a", class_='object-street').attrs['href']
house.find('span', title=re.compile('Number of')).text
house.find("span", title="WaitingFor").text

我想我在找一个“包装工”,但在这里没有经验。任何正确方向的提示都将不胜感激!你知道吗


Tags: 函数textrestreetobjecttitleaddress页面
1条回答
网友
1楼 · 发布于 2024-04-26 13:59:00

创建一个函数,尝试查找文本,并返回一个字符串错误消息,而不是引发错误。你知道吗

def safe_find(element, text, error_message):
    try:
        return element.find(text=re.compile(text))
    except:
        return error_message

然后可以使用此函数检索可能缺少的字段,而不需要任何内联try except子句。你知道吗

address = safe_find(house, '[0-9]{4}[ ]?[azAZ]{2}', "ERR No Address")

编辑:您可以使函数稍微更具可扩展性,接受find可以接受的任何参数:

def safe_find(element, error_message, *args, **kargs):
    try:
        return element.find(*args, **kargs)
    except:
        return error_message

safe_find(house, "ERR No Address", text=re.compile('[0-9]{4}[ ]?[azAZ]{2}'))
safe_find(house, "ERR no street", "a", class_='object-street')
safe_find(house, "ERR no street", "a", class_='object-street')
safe_find(house, "ERR no number", 'span', title=re.compile('Number of'))
safe_find(house, "ERR no WaitingFor", "span", title="WaitingFor")

。。。但是您不能使用它来访问任何属性,例如textattrs['href']。你知道吗


编辑:您可以创建一个特殊的对象,其中包含一条错误消息,用于您可能要访问的所有属性。你知道吗

import collections
def safe_find(element, error_message, *args, **kargs):
    class FakeResult:
        def __init__(self, err):
            self.attrs = collections.defaultdict(lambda: err)
            self.text = err
            #todo: add other attributes here, like:
            #self.whatever = err
    try:
        return element.find(*args, **kargs)
    except:
        return FakeResult(error_message)

safe_find(house, "ERR no street", "a", class_='object-street').text
safe_find(house, "ERR no street", "a", class_='object-street').attrs['href']
safe_find(house, "ERR no number", 'span', title=re.compile('Number of')).text
safe_find(house, "ERR no WaitingFor", "span", title="WaitingFor").text

但是,只有当您要访问textattrs属性时,这个才有效。safe_find(house, "ERR No Address", text=re.compile('[0-9]{4}[ ]?[azAZ]{2}'))后面没有.text.attrs["stuff"],它将为您提供一个FakeResult实例,而不是一个字符串。你知道吗

相关问题 更多 >