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.h
tml
问题:
- 如何可靠地确保 WGET 使用“正确的”编码?
- 在 python 中是否可以使用任何技巧来处理这种情况?
您的字符串中有问题的部分 (-♀️♂️-) 字面上包含 \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-
资源(必读):
- Python Specific Encodings
unicode_escape
和 raw_unicode_escape
- Emoji Sequences (in particular, man/woman Vampire)
你的字符串中可疑部分的完整字符列表 (-♀️♂️-):
-
(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)
我正在使用 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.h
tml
问题:
- 如何可靠地确保 WGET 使用“正确的”编码?
- 在 python 中是否可以使用任何技巧来处理这种情况?
您的字符串中有问题的部分 (-♀️♂️-) 字面上包含 \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-
资源(必读):
- Python Specific Encodings
unicode_escape
和raw_unicode_escape
- Emoji Sequences (in particular, man/woman Vampire)
你的字符串中可疑部分的完整字符列表 (-♀️♂️-):
-
(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)