hect0x7 / JMComic-Crawler-Python

Python API for JMComic | 提供Python API访问禁漫天堂,同时支持网页端和移动端 | 禁漫天堂GitHub Actions下载器🚀
https://jmcomic.readthedocs.io/zh-cn/latest/option_file_syntax/#
MIT License
827 stars 1.95k forks source link

功能优化(待实现):使用HTML解析库替换正则表达式 #14

Closed hect0x7 closed 1 year ago

hect0x7 commented 1 year ago

这是一个求助Issue,希望得到帮助。

目前API解析禁漫网页html代码,使用的是正则表达式+反射,代码位于JmcomicText 最近发现,这种方式有问题:存在网页结构混淆 比如这个域名jm-comic.cc,返回的网页代码中加入了随机空格。这种方式会影响正则表达式的匹配,导致解析不成功。 因此,应该选用更加彻底的方案,即使用HTML库解析html代码,python有很多这种HTMl库。

不过问题就是,我不太会xpath那些东西,也不太打算学(~ ̄▽ ̄)~ 所以想问问,有没有这方面的懂哥大佬愿意帮忙写一下xpath表达式,来帮忙优化此项目。 非常感谢,Salute!🖖🏻

hect0x7 commented 1 year ago

目前使用的正则表达式的方案,有1个字段是会在反混淆的HTML下失败。 这个字段是author_list,代表一个本子的作者列表,使用的正则表达式是

pattern_html_album_author_list = [
    # 下面这个正则用于缩小范围
    compile('作者: <span itemprop="author" data-type="author">(\s*<a.*?>(.*?)</a>)*\s*</span>'),
    # 下面这个正则用于捕获所有作者的名称
    compile("<a.*?>(.*?)</a>"),
]

这个字段的xpath表达式需求优先级最高,其他字段暂时都能work

Yunxi-awa commented 9 months ago

css selector不比xpath香,使用beautifulsoup即可,我的Xpath语法也学得不怎么样,可以走捷径在浏览器F12元素选项卡右键需要查询的元素,在右键菜单中找到复制,复制的二级菜单中有复制selector的选项可以直接复制 以下是我未发现jmcomic库之前爬取用的css selector,很久远了,不保证可以使用

photo页面:

page_count: #pageselect > option:nth-child(1)

album页面:

name:            #book-name
章节名称和上传时间 #episode-block > div > div > ul > a                               (查找所有
章节aid           #episode-block > div > div > ul > a的data-album属性 (查找所有
默认作品标签       #intro-block > div:nth-child(3) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认角色标签       #intro-block > div:nth-child(4) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认作者标签       #intro-block > div:nth-child(5) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认标签           #intro-block > div:nth-child(6) > span > a[class="btn btn-sm btn-primary"]   (查找所有
用户作品标签       #intro-block > div:nth-child(3) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户角色标签       #intro-block > div:nth-child(4) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户作者标签       #intro-block > div:nth-child(6) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户标签           #intro-block > div:nth-child(5) > span > a[class="btn btn-sm btn-default"]    (查找所有
         注意这里的顺序child值不是递增的
叙述              head > meta:nth-child(7) 的content属性,记得replace("免費成人H漫線上看", "")
         注意这里的head前没有井号
上传时间          #wrapper > div.container > div:nth-child(4) > div > div.panel.panel-default.visible-lg.hidden-xs > div.panel-body > div > div.col-lg-7 > div:nth-child(1) > div:nth-child(10) > span:nth-child(1) 的content属性
更新时间          #wrapper > div.container > div:nth-child(4) > div > div.panel.panel-default.visible-lg.hidden-xs > div.panel-body > div > div.col-lg-7 > div:nth-child(1) > div:nth-child(10) > span:nth-child(2) 的content属性
hect0x7 commented 9 months ago

css selector不比xpath香,使用beautifulsoup即可,我的Xpath语法也学得不怎么样,可以走捷径在浏览器F12元素选项卡右键需要查询的元素,在右键菜单中找到复制,复制的二级菜单中有复制selector的选项可以直接复制 以下是我未发现jmcomic库之前爬取用的css selector,很久远了,不保证可以使用

photo页面: page_count: #pageselect > option:nth-child(1)

album页面:

name:            #book-name
章节名称和上传时间 #episode-block > div > div > ul > a                               (查找所有
章节aid           #episode-block > div > div > ul > a的data-album属性 (查找所有
默认作品标签       #intro-block > div:nth-child(3) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认角色标签       #intro-block > div:nth-child(4) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认作者标签       #intro-block > div:nth-child(5) > span > a[class="btn btn-sm btn-primary"]   (查找所有
默认标签           #intro-block > div:nth-child(6) > span > a[class="btn btn-sm btn-primary"]   (查找所有
用户作品标签       #intro-block > div:nth-child(3) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户角色标签       #intro-block > div:nth-child(4) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户作者标签       #intro-block > div:nth-child(6) > span > a[class="btn btn-sm btn-default"]    (查找所有
用户标签           #intro-block > div:nth-child(5) > span > a[class="btn btn-sm btn-default"]    (查找所有
         注意这里的顺序child值不是递增的
叙述              head > meta:nth-child(7) 的content属性,记得replace("免費成人H漫線上看", "")
         注意这里的head前没有井号
上传时间          #wrapper > div.container > div:nth-child(4) > div > div.panel.panel-default.visible-lg.hidden-xs > div.panel-body > div > div.col-lg-7 > div:nth-child(1) > div:nth-child(10) > span:nth-child(1) 的content属性
更新时间          #wrapper > div.container > div:nth-child(4) > div > div.panel.panel-default.visible-lg.hidden-xs > div.panel-body > div > div.col-lg-7 > div:nth-child(1) > div:nth-child(10) > span:nth-child(2) 的content属性

感谢你的回复,css selector确实很方便。 不过这个issue面临的问题,我目前是让正则表达式匹配任意空格来解决的,目前能work。 由于jmcomic目前大量采用了正则表达式来解析,我暂时不太打算换到其他技术栈了~但还是感谢你提供的信息