0

我正在编写代码来使用 python 解析 torrent 文件中的跟踪器信息。

import bencoder
import sys

target = './'+sys.argv[1]

with open(target, 'rb') as torrent_file:
    torrent = bencoder.decode(torrent_file.read())

i=0
while True:
    try:
        print(torrent[b'announce-list'][i])
        i+=1
    except:
        break
    

输出如下。

[b'udp://tracker.openbittorrent.com:80/announce']

[b'udp://tracker.opentrackr.org:1337/announce']

我想解析下面表格中的值。

[“tracker.openbittorrent.com”,80]

[“tracker.opentrackr.org”,1337]

我应该如何解析它?

4

1 回答 1

0

您可以urllib.parse.urlparse按如下方式使用

from urllib.parse import urlparse
url1 = b'udp://tracker.openbittorrent.com:80/announce'
url2 = b'udp://tracker.opentrackr.org:1337/announce'
c1 = urlparse(url1)
c2 = urlparse(url2)
hostport1 = c1.netloc.rsplit(b':',1)
hostport2 = c2.netloc.rsplit(b':',2)
hostport1[0] = hostport1[0].decode()
hostport1[1] = int(hostport1[1])
hostport2[0] = hostport2[0].decode()
hostport2[1] = int(hostport2[1])
print(hostport1)
print(hostport2)

输出

['tracker.openbittorrent.com', 80]
['tracker.opentrackr.org', 1337]

说明:我提取netloc,然后从右边最多拆分一次b':',然后应用.decode到主机端口转换bytesstrint转换bytesint

编辑:经过更仔细的阅读,我注意到您可以访问.hostname并且.port允许更简洁的代码来完成该任务,即

from urllib.parse import urlparse
url1 = b'udp://tracker.openbittorrent.com:80/announce'
url2 = b'udp://tracker.opentrackr.org:1337/announce'
c1 = urlparse(url1)
c2 = urlparse(url2)
hostport1 = [c1.hostname.decode(), c1.port]
hostport2 = [c2.hostname.decode(), c2.port]
print(hostport1)
print(hostport2)

给出与上面的代码相同的输出。

于 2022-01-26T11:23:51.997 回答