即使在 1.x 分支上,我也能够重现此问题。问题是 Apache HTTP 客户端库内部使用的 Java URI 类不支持非转义 UTF-8 字符:
来自 JavaDoc 文档java.net.URI
:
字符类别
RFC 2396 精确地指定了在 URI 引用的各个组成部分中允许使用的字符。以下类别(其中大部分来自该规范)用于描述这些约束:
- alpha US-ASCII 字母字符,'A' 到 'Z' 和 'a' 到 'z'
- digit US-ASCII 十进制数字字符,'0' 到 '9'
- alphanum 所有字母和数字字符未保留所有字母数字字符以及字符串“_-!.~'()*”中的字符
- punct 字符串中的字符 ",;:$&+="
- 保留 所有标点字符以及字符串“?/[]@”中的字符
- 转义八位字节,即由百分比字符 ('%') 后跟两个十六进制数字 ('0'-'9'、'A'-'F' 和 'a'-'f') 组成的三元组
- other 不在 US-ASCII 字符集中的 Unicode 字符,不是控制字符(根据
Character.isISOControl
方法),也不是空格字符(根据Character.isSpaceChar
方法)(偏离 RFC 2396,仅限于 US-ASCII )
所有合法 URI 字符的集合由未保留、保留、转义和其他字符组成。
正确转义的 URL 看起来更像:
http://agahi.safirak.com/ads/850/%D9%BE%DB%8C%DA%86-%D8%A8%D9%86%D8%AF-%D8%A8%D8%A7%D8 %AF%DB%8C-%D9%87%D9%81%D8%AA%DB%8C%D8%B1%DB%8C-1800-%D8%AF%D9%88%D8%B1-%D8% A8%D8%A7%D8%AF%DB%8C-%D8%AC%DB%8C%D8%B3%D9%88%D9%86.html
实际上,如果您在 Chrome 上打开示例 URL,然后从地址栏中复制该 URL,您将获得转义表示。随意为此打开一个问题(否则我会这样做)。同时,您可以尝试使用protocol-http
不使用 Apache HTTP 客户端的插件。我已经在本地进行了测试,并且 parsechecker 工作正常:
➜ local (master) ✗ bin/nutch parsechecker "http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html"
fetching: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
robots.txt whitelist not configured.
parsing: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
contentType: text/html
signature: 048b390ab07464f5d61ae09646253529
---------
Url
---------------
http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
---------
ParseData
---------
Version: 5
Status: success(1,0)
Title: پیچ بند بادی هفتیری 1800 دور بادی جیسون-نیازمندی سفیرک
Outlinks: 76
outlink: toUrl: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html anchor:
outlink: toUrl: http://agahi.safirak.com/assets/fonts/font-awesome/css/font-awesome.min.css anchor:
outlink: toUrl: http://agahi.safirak.com/assets/css/bootstrap.css anchor:
...