提取某站种子页面信息转BBCode

July 5, 2020 · 分享 · 109次阅读

算是一个练习

之前都是用的BeautifulSoup来提取需要的信息,相对来说操作简单,但是需要这个额外的库有时候感觉还是比较慢。

之前也知道python内置了HTMLParser,可以用来解析html,但是一直没用过,这次用这个来做。

关键目标

  • 尽量保持原有对齐
  • mediainfo分离
  • 图片

实现代码

直接上代码了。

from html.parser import HTMLParser

class THTMLParser(HTMLParser):

    def __init__(self):
        super(THTMLParser, self).__init__()
        self.brflag = 0
        self.qflag = None
        self.imgtag = None
        self.xtag = False
        self.recording = False
        self.record_step = 0 # 抽取进入的深度
        self.record_data = []

    def handle_starttag(self, tag, attrs):
        if tag == "legend":
            # 跳过 legend
            self.recording = False
        if tag == "x":
            self.xtag = True
        if tag == "div":
            if self.recording is True:
                self.record_step += 1
            for key, value in attrs:
                if key == "id" and value == "kdescr":
                    self.recording = True # 开始记录
                    self.record_step += 1 # 步进步数
                    break
        if tag == "fieldset":
            if self.recording is True:
                self.record_step += 1
            if self.qflag is None:
                self.qflag = "quote_start"

    def handle_endtag(self, tag):
        if tag == "legend":
            self.recording = True
            return
        if self.recording is True:
            self.record_step -= 1
            # 回退到起始tag 则说明要抽取的部分遍历结束了
            if self.record_step == 0:
                self.recording = False
        # if self.xtag is True:
        #     self.xtag = False
        if tag == "fieldset" and self.qflag == "find_next":
            self.record_data[-1] += "[/quote]"
            self.qflag = None

    def handle_startendtag(self, tag, attrs):
        if self.recording is False:
            return
        # 处理 <tagname /> 这种形式的tag
        if tag == "br":
            if self.brflag != 0:
                if len(self.record_data) > 0:
                    if len(self.record_data[-1]) > 0 and self.record_data[-1][-1] != "\n":
                        self.record_data[-1] += "\n"
                self.brflag = 0
            self.brflag += 1
        if tag == "hr":
            if self.qflag is None:
                self.qflag = "quote_start"
            if self.qflag == "find_next":
                self.record_data[-1] += "[/quote]"
                self.qflag = None
        if tag == "img":
            for key, value in attrs:
                if key == "src":
                    text = f"[img]{value}[/img]"
                    self.record_data.append(text)

    def handle_data(self, data: str):
        if self.recording is True:
            # 这里没有处理 \u3000 即全角空白 因为全角空白可以对齐
            text = data.strip("\n\t").replace("\xa0", " ")
            if text != "":
                if self.brflag == 1:
                    self.brflag = 0
                if self.xtag is True:
                    self.record_data[-1] += text
                    self.xtag = False
                else:
                    if self.qflag == "quote_start":
                        text = "[quote]" + text
                        self.qflag = "find_next"
                    self.record_data.append(text)
                if self.record_data[-1] in ["Video", "Audio", "Other"]:
                    self.record_data[-1] = "\n" + self.record_data[-1]

    def handle_comment(self, data):
        pass
        # print('<!--', data, '-->')

    def handle_entityref(self, name):
        pass
        # print('&%s;' % name)

    def handle_charref(self, name):
        pass
        # print('&#%s;' % name)

if __name__ == "__main__":
    with open(r"torrent.html", "r", encoding="utf-8") as f:
        content = f.read()
    parser = THTMLParser()
    parser.feed(content)
    with open(r"torrent.md", "w", encoding="utf-8") as f:
        content = f.write("\n".join(parser.record_data))

提取效果预览

2020-07-05T10:24:53.png

ENJOY 0

none

最后编辑于1年前

添加新评论

avatar

未末

118

文章数

260

评论数

7

分类

新鲜出炉の评论

获取CSDN学院m3u8解密的key
路人甲
路人甲2021-10-05

请问这个方法失效了么?获取到的是空串

获取CSDN学院m3u8解密的key
DK爱梦游
DK爱梦游2021-09-29

大佬求教,51cto的KEY怎么获取?

XstreamDL-CLI BUG修复记录
poohboy
poohboy2021-09-25

大佬,我想问一下,iqiyi的m3u8是不是没法获取?我只找到了一个dash链接,然后手动下载了里面的m4s,但用nilaoda的那个解密工具解不了,老提示获取kid失败

XstreamDL-CLI BUG修复记录
Andist
Andist2021-09-17

en……实在不好意思,代理我知道怎么启用了。我只勾选了自定义代理,但没有填写proxy参数,我太愚钝了对不起!!!

XstreamDL-CLI BUG修复记录
Andist
Andist2021-09-17

感谢您开发的这款软件,对于第一次下载mpd的小白而言很友好! 这段时间用下来就是有时候下载直连的海外视频流时可能因为网络状况不佳,会有下载不完整的问题,下载完进度没到100%,但是也合并解密了,不知道能否增加下载不完整在最后输出报错信息的功能呢? 以及我想请教一下如何让下载器使用小飞机的代理呢?我尝试在“使用自定义代理”的选项上勾选,但是好像命令行中没有变化? (另外我猜您图中的样本是在下载CP+上的用九柑仔店是吗?我也很喜欢这部剧,是我心目中排名第一的台剧哈哈)