@@ -24,7 +24,11 @@ def get(url: str) -> tuple[Union[str, bytes], str, str]:
2424 parser = HTMLParser (url = url )
2525 parser .feed (response .text )
2626 if parser .ret :
27- return parser .ret [- 1 ] # 因为看到一个网站192*192写在32*32后面,所以取-1了
27+ return parser .ret [- 1 ]
28+ # 要是这个网站写了多条<link rel="icon">和<link rel="shortcut icon">标签,
29+ # 就会多次解析,后面一条会覆盖前一条,最后留下的是最下面一条,也符合浏览器的读取,缺点是会多次下载该网站的icon
30+ # 实例:看到多个个网站高分辨率的写在低分辨率的后面
31+ #TODO 但是实际上浏览器加载的是第一条,所以是否要增加两个api,一个获取全部文件,一个“真”模拟浏览器获取第一个
2832 else :
2933 return (f'此api不支持该网站\n html原文:\n { response .text } ' , 'txt' , 'text' )
3034
@@ -63,10 +67,27 @@ def get_binary_img(self, href_value: str, file_type: str):
6367 self .ret .append ((r .content , file_type , 'binary' ))
6468 return
6569
66- def handle_starttag (self , tag , attrs ):
67- # 要是这个网站写了多条<link rel="icon">和<link rel="shortcut icon">标签,
68- # 就会多次解析,后面一条会覆盖前一条,最后留下的是最下面一条,也符合浏览器的读取,缺点是会多次下载该网站的icon
69- # 对应上面 return parser.ret[-1]
70+ def handle_starttag (self , tag : str , attrs : list [tuple [str , str ]]):
71+ """解析思路
72+ 1. 检查<link rel="icon">和<link rel="shortcut icon">标签
73+ 2. 检查是否有type,有type的进入2.x流程
74+ 2.1. 对应type除了svg都一定是二进制流直接下载,结束流程
75+ 2.2. type是svg的,检查下href是不是.svg后缀,是说明是二进制流,不是说明是RFC2397定义的文本编码成base64的形式,直接下载,结束流程
76+ 2.3. type不合法,调用检查href的流程(即3.x)
77+ 3. 检查是否有href,没type有href的进入3.x流程
78+ 3.1. 检查是否是RFC2397定义的一些数据(除开svg,因为svg用这个是要用文本模式写,其他都二进制流模式写就好了,还有svg必有type,况且前面已经处理过了) #TODO 需要实验,没有type,svg在RFC2397和*.svg两种情况下是否能顺利读取,如果能顺利读取,那就要加上svg在这里了
79+ 3.2. 检查href文件后缀(除去svg,因为前面处理过了),对应的直接二进制流模式写入
80+ 3- 只要有type或者href,就不走下面的流程了
81+ 4. 有这标签,但是type和href属性都没有,那直接忽略掉了,置空
82+
83+ 实验数据:有没有type,type错误,不影响edge正确读取*.png
84+ #TODO 故此提议是否应修改解析流程,先href再type
85+ #TODO 有type,但是是base64的数据呢,直接二进制写入了,不行的
86+
87+ Args:
88+ tag (str): _description_
89+ attrs (list[tuple[str, str]]): _description_
90+ """
7091 if tag != 'link' :
7192 return
7293
@@ -110,7 +131,7 @@ def href_attr_parser(self, href_value) -> None:
110131 self .get_binary_img (href_value , file_type )
111132 return
112133
113- # 无type,href也不合法,目前策略是放弃,需要进一步讨论,需要参考浏览器面对这种情况的应对策略
134+ # 无type,href也不合法,放弃掉,置空
114135
115136 def type_attr_parser (self , href_value , attr_value_dict ) -> None :
116137 match attr_value_dict ['type' ]:
@@ -138,5 +159,6 @@ def type_attr_parser(self, href_value, attr_value_dict) -> None:
138159 case 'image/tiff' : # .tif、.tiff
139160 self .get_binary_img (href_value , 'tif' )
140161 case _:
141- self .ret .append ((f"该网站填写了错误的数据标签,如果看到此消息,请提交issue给此项目,包括此文件,开发者将帮忙联系网站管理者\n self.url:{ self .url } \n attr_value_dict['type']:{ attr_value_dict ['type' ]} " , 'txt' , 'text' )) # 不合法的type
162+ if 'href' in attr_value_dict : # 不合法的type
163+ self .href_attr_parser (href_value )
142164 return
0 commit comments