Skip to content

Commit 6310bcc

Browse files
committed
添加函数注释,修改html解析api流程
1 parent c8feb86 commit 6310bcc

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

src/api/html_parser_api.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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不支持该网站\nhtml原文:\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给此项目,包括此文件,开发者将帮忙联系网站管理者\nself.url:{self.url}\nattr_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

Comments
 (0)