问题描述
在某些情况下,我尝试使用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 (将#修改为@)