@@ -115,7 +115,7 @@ def analyse_jm_album_html(cls, html: str) -> JmAlbumDetail:
115115
116116 @classmethod
117117 def analyse_jm_search_html (cls , html : str ) -> JmSearchPage :
118- return JmcomicSearchTool .parse_html_to_page (html )
118+ return JmSearchTool .parse_html_to_page (html )
119119
120120 @classmethod
121121 def reflect_new_instance (cls , html : str , cls_field_prefix : str , clazz : type ):
@@ -217,7 +217,39 @@ def parse_to_abspath(cls, dsl_text: str) -> str:
217217JmcomicText .dsl_replacer .add_dsl_and_replacer (r'\$\{(.*?)\}' , JmcomicText .match_os_env )
218218
219219
220- class JmcomicSearchTool :
220+ class PatternTool :
221+
222+ @classmethod
223+ def match_or_default (cls , html : str , pattern : Pattern , default ):
224+ match = pattern .search (html )
225+ return default if match is None else match [1 ]
226+
227+ @classmethod
228+ def require_match (cls , html : str , pattern : Pattern , msg , rindex = 1 ):
229+ match = pattern .search (html )
230+ if match is not None :
231+ return match [rindex ]
232+
233+ ExceptionTool .raises_regex (
234+ msg ,
235+ html = html ,
236+ pattern = pattern ,
237+ )
238+
239+ @classmethod
240+ def require_not_match (cls , html : str , pattern : Pattern , * , msg_func ):
241+ match = pattern .search (html )
242+ if match is None :
243+ return
244+
245+ ExceptionTool .raises_regex (
246+ msg_func (match ),
247+ html = html ,
248+ pattern = pattern ,
249+ )
250+
251+
252+ class JmSearchTool :
221253 # 用来缩减html的长度
222254 pattern_html_search_shorten_for = compile (r'<div class="well well-sm">([\s\S]*)<div class="row">' )
223255
@@ -238,30 +270,31 @@ class JmcomicSearchTool:
238270 # 查找错误,例如 [错误,關鍵字過短,請至少輸入兩個字以上。]
239271 pattern_html_search_error = compile (r'<fieldset>\n<legend>(.*?)</legend>\n<div class=.*?>\n(.*?)\n</div>\n</fieldset>' )
240272
273+ pattern_html_search_total_count = compile (r'<span class="text-white">(\d+)</span> A漫.' ), 0
274+
241275 @classmethod
242276 def parse_html_to_page (cls , html : str ) -> JmSearchPage :
243- # 检查是否失败
244- match = cls .pattern_html_search_error .search (html )
245- if match is not None :
246- topic , reason = match [1 ], match [2 ]
247- ExceptionTool .raises_regex (
248- f'{ topic } : { reason } ' ,
249- html = html ,
250- pattern = cls .pattern_html_search_error ,
251- )
277+ # 1. 检查是否失败
278+ PatternTool .require_not_match (
279+ html ,
280+ cls .pattern_html_search_error ,
281+ msg_func = lambda match : '{}: {}' .format (match [1 ], match [2 ])
282+ )
252283
253- # 缩小文本范围
254- match = cls . pattern_html_search_shorten_for . search ( html )
255- if match is None :
256- ExceptionTool . raises_regex (
257- '未匹配到搜索结果' ,
258- html = html ,
259- pattern = cls . pattern_html_search_shorten_for ,
260- )
261- html = match [ 0 ]
284+ # 2. 缩小文本范围
285+ html = PatternTool . require_match (
286+ html ,
287+ cls . pattern_html_search_shorten_for ,
288+ msg = '未匹配到搜索结果' ,
289+ )
290+
291+ # 3. 提取结果
292+ import math
262293
263- # 提取结果
264294 content = [] # content这个名字来源于api版搜索返回值
295+ total_count = PatternTool .match_or_default (html , * cls .pattern_html_search_total_count ) # 总结果数
296+ page_count = math .ceil (int (total_count ) / 80 )
297+
265298 album_info_list = cls .pattern_html_search_album_info_list .findall (html )
266299
267300 for (album_id , title , _ , label_category , label_sub , tag_text ) in album_info_list :
@@ -273,7 +306,7 @@ def parse_html_to_page(cls, html: str) -> JmSearchPage:
273306 }
274307 ))
275308
276- return JmSearchPage (content )
309+ return JmSearchPage (content , page_count )
277310
278311 @classmethod
279312 def parse_api_resp_to_page (cls , data : DictModel ) -> JmSearchPage :
@@ -300,6 +333,7 @@ def parse_api_resp_to_page(cls, data: DictModel) -> JmSearchPage:
300333 ]
301334 }
302335 """
336+ total : int = int (data .total )
303337
304338 def adapt_item (item : DictModel ):
305339 item : dict = item .src_dict
@@ -311,7 +345,7 @@ def adapt_item(item: DictModel):
311345 for item in data .content
312346 ]
313347
314- return JmSearchPage (content )
348+ return JmSearchPage (content , total )
315349
316350
317351class JmApiAdaptTool :
0 commit comments