Wget、URL、Python 和 Mysql 编码

Wget, URLs, Python and Mysql encoding

我正在使用 wget 递归下载整个网站。我使用的命令是:

wget
  -rH   
  --level=inf
  --adjust-extension
  --no-check-certificate
  --restrict-file-names=unix
  --execute robots=off

输出保存在 Ubuntu 20 台机器上。

使用 python3,我使用以下代码从文件路径中获取 URLs:

for root, _, f_names in os.walk(target_path, topdown=False):
    for current_file in f_names:
        file_url: tmp_file_url.encode("utf-8", 'backslashreplace').decode("utf-8"), #Encode URL to escape "weird" characters

最后,我将 URL 插入到 MySQL 带有 utf8mb4 排序规则的数据库中。

在一种情况下,我找不到encode/escape以下URL的正确方法:

编码版本:

**DOMAIN**/happy-hallowine-\u200d♀️\u200d♂️-tomorrow-thursday-we-have-new-bites-on-the-menu-such-as-grilled-vegg/index.html

解码版本(http://www.asiteaboutnothing.net/c_decode-url.html):

**DOMAIN**%2Fhappy-hallowine-%F0%9F%A7%9B%F0%9F%8F%BD%2Fu200d%E2%99%80%EF%B8%8F%F0%9F%8D%B7%F0%9F%A7%9B%F0%9F%8F%BD%2Fu200d%E2%99%82%EF%B8%8F-tomorrow-thursday-we-have-new-bites-on-the-menu-such-as-grilled-vegg%2Findex.html

问题:

您的字符串中有问题的部分 (-‍♀️‍♂️-) 字面上包含 \u200d转义 字符 \u200d (U+200D, 零宽度连接器)。解决方案可以如下简单:

from urllib.parse import quote, unquote

temp_str = r'-\u200d♀️\u200d♂️-'
print( 'temp_str', temp_str)
print( 'temp_url', quote(temp_str))

good_str = temp_str.encode( 'raw_unicode_escape').decode( 'unicode_escape')
print( 'good_str', good_str)
print( 'good_url', quote(good_str))

结果: .\SO881227.py

temp_str -\u200d♀️\u200d♂️-
temp_url -%F0%9F%A7%9B%F0%9F%8F%BD%5Cu200d%E2%99%80%EF%B8%8F%F0%9F%8D%B7%F0%9F%A7%9B%F0%9F%8F%BD%5Cu200d%E2%99%82%EF%B8%8F-
good_str -‍♀️‍♂️-
good_url -%F0%9F%A7%9B%F0%9F%8F%BD%E2%80%8D%E2%99%80%EF%B8%8F%F0%9F%8D%B7%F0%9F%A7%9B%F0%9F%8F%BD%E2%80%8D%E2%99%82%EF%B8%8F-

资源(必读):

你的字符串中可疑部分的完整字符列表 (-‍♀️‍♂️-):

  • - (U+002D, Hyphen-Minus)
  • </code> (U+1F9DB, <em>VAMPIRE (0xd83e,0xdddb)</em>)</li> <li><code> (U+1F3FD, FITZPATRICK 类型 4 表情符号修饰符 (0xd83c,0xdffd))
  • (U+200D,零宽度连接器
  • (U+2640, 女号)
  • (U+FE0F, Variation Selector-16)
  • (U+1F377, 酒杯 (0xd83c,0xdf77))
  • </code> (U+1F9DB, <em>VAMPIRE (0xd83e,0xdddb)</em>)</li> <li><code> (U+1F3FD, FITZPATRICK 类型 4 表情符号修饰符 (0xd83c,0xdffd))
  • (U+200D,零宽度连接器
  • (U+2642, 男性星座)
  • (U+FE0F, Variation Selector-16)
  • - (U+002D, Hyphen-Minus)