Python:在使用request-html进行网络抓取并默认情况下返回None对象时,内联捕获错误

问题描述

在某些情况下,我尝试使用request-html抓取网站This页面给我带来了麻烦,因为与其他大多数狗狗列表不同,它缺少图片

到目前为止,我的代码是这样的。我尝试过的一种方法是使用函数来捕获传递到DogCrawler._new_dog.kwargs中的错误

class DogCrawler(Crawler):
    _dog_schema = {
            "url": "","name": "","imgsrc": "","breed": "","age": "","price": "","location": "","description": ""
        }
    
    def __init__(self,url):
        super(DogCrawler,self).__init__(url)
        self.dogs = []
    def __enter__(self):
        self.navigate(self.url)
        self._get_dogs()
    def _get_dogs(self):
        raise NotImplementedError
    def _new_dog(self,**kwargs):
        new_dog = DogCrawler._dog_schema.copy()
        for k,v in kwargs.items():
            try:
                new_dog[k] = v
            except:
                new_dog[k] = None
        self.dogs.append(new_dog)
        return new_dog

...

class DogzOnlineCrawler(DogCrawler):
    """
    Finds all the dog sales listed on DogzOnline
    """

    ...

    def _get_dogs_for_sale(self,age):
        for link in self.current_page.html.find(".p10 li a"):
            new_session = HTMLSession()
            breed = link.text
            urlbase = "{uri.scheme}://{uri.netloc}".format(uri=urllib.parse.urlparse(self.url))
            breed_link = urlbase + link.attrs["href"]
            breed_page = new_session.get(breed_link)
            print(breed_link)
            # autopagination doesn't seem to work??? most of the time it's just 1 page anyway
            for listing in breed_page.html.find("article"):
                self._new_dog(
                    url=urlbase + listing.find("h2 > a")[0].attrs["href"],name=listing.find("h2 > a")[0].text,imgsrc=listing.find("aside img")[0].attrs["src"],breed=breed,age=age,price=None,location=listing.xpath("//article//dt[text()='Location :']/following-sibling::dd[1]")[0].text,description=listing.xpath("//article//p")[-1].text
                )
            new_session.close()

否则,到目前为止,我已经尝试了几种不同的策略来克服这一问题。另一种方法是尝试将每一行都包装在这样的函数中(该函数有效,但不适用于所有事物):

def get_default(html_obj,index=0):
    if html_obj:
        return html_obj[index].text
    else:
        return None

或更通用的形式,键入起来更加繁琐(例如在传递给DogCrawler._new_dog的每个kwarg值上键入新的lambda函数):

def get_default(html_obj,function,index=0):
    if html_obj:
        return function(html_obj[index])
    else:
        return None

我的问题是,有没有更简单,更“ Pythonic”的方式来处理此问题?例如,当抓取网站并发现某些元素并非总是出现在要抓取的每个页面或条目上时,是否有一种更整洁的方法来插入认值(例如,无),只要它证明您想要的HTML不存在吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)