Heritrix 在条件注释块中找不到 CSS 个文件
Heritrix not finding CSS files in conditional comment blocks
Problem/evidence
Heritrix 未检测到在一个字符串中打开和关闭的条件注释中是否存在文件,例如:
<!--[if (gt IE 8)|!(IE)]><!-->
<link rel="stylesheet" href="/css/mod.css" />
<!--<![endif]-->
但是像这样的标准条件块工作正常:
<!--[if lte IE 9]>
<script src="/js/ltei9.js"></script>
<![endif]-->
我发现问题出在评论的这一部分:
<!-->
在测试用例中删除该块然后允许 Heritrix 发现 css 文件。
问题
我应该如何克服这个问题?它是 Heritrix 错误,还是我们可以通过 crawler-beans 声明来绕过?我知道 "trick" 某些浏览器版本有评论块,更改网站代码不是一个选项。 Heritrix 能否适配否定评论?
ExtractorHTML 使用以下正则表达式解析页面:
static final String RELEVANT_TAG_EXTRACTOR =
"(?is)<(?:((script[^>]*+)>.*?</script)" + // 1, 2
"|((style[^>]*+)>.*?</style)" + // 3, 4
"|(((meta)|(?:\w{1,"+MAX_ELEMENT_REPLACE+"}))\s+[^>]*+)" + // 5, 6, 7
"|(!--(?!\[if).*?--))>"; // 8
基本上,案例 1 .. 7 匹配任何有趣的标签以进行 link 提取,案例 8 匹配 HTML 评论以便丢弃它们。如您所见,案例 8 小心地避免了 <!--[if ... -->
形式的匹配注释,以免它们被丢弃。因此,在您的特定情况下,后面的 <!-->
被匹配为起始注释,并且最多被丢弃
最后 -->
.
<!--[if (gt IE 8)|!(IE)]><!-->
是一种使 XHTML 有效的技巧,其中条件内容由任何非 IE 浏览器解析。 Heritrix 可以通过使 RELEVANT_TAG_EXTRACTOR 不将 <!-->
视为注释开始来修复。这应该有效:
static final String RELEVANT_TAG_EXTRACTOR =
"(?is)<(?:((script[^>]*+)>.*?</script)" + // 1, 2
"|((style[^>]*+)>.*?</style)" + // 3, 4
"|(((meta)|(?:\w{1,"+MAX_ELEMENT_REPLACE+"}))\s+[^>]*+)" + // 5, 6, 7
"|(!--(?!\[if|>).*?--))>"; // 8
您始终可以编译 java class 继承 org.archive.modules.extractor.ExtractorHTML 并使用您的 class 代替原始的 ExtractorHTML。
Problem/evidence
Heritrix 未检测到在一个字符串中打开和关闭的条件注释中是否存在文件,例如:
<!--[if (gt IE 8)|!(IE)]><!-->
<link rel="stylesheet" href="/css/mod.css" />
<!--<![endif]-->
但是像这样的标准条件块工作正常:
<!--[if lte IE 9]>
<script src="/js/ltei9.js"></script>
<![endif]-->
我发现问题出在评论的这一部分:
<!-->
在测试用例中删除该块然后允许 Heritrix 发现 css 文件。
问题
我应该如何克服这个问题?它是 Heritrix 错误,还是我们可以通过 crawler-beans 声明来绕过?我知道 "trick" 某些浏览器版本有评论块,更改网站代码不是一个选项。 Heritrix 能否适配否定评论?
ExtractorHTML 使用以下正则表达式解析页面:
static final String RELEVANT_TAG_EXTRACTOR = "(?is)<(?:((script[^>]*+)>.*?</script)" + // 1, 2 "|((style[^>]*+)>.*?</style)" + // 3, 4 "|(((meta)|(?:\w{1,"+MAX_ELEMENT_REPLACE+"}))\s+[^>]*+)" + // 5, 6, 7 "|(!--(?!\[if).*?--))>"; // 8
基本上,案例 1 .. 7 匹配任何有趣的标签以进行 link 提取,案例 8 匹配 HTML 评论以便丢弃它们。如您所见,案例 8 小心地避免了 <!--[if ... -->
形式的匹配注释,以免它们被丢弃。因此,在您的特定情况下,后面的 <!-->
被匹配为起始注释,并且最多被丢弃
最后 -->
.
<!--[if (gt IE 8)|!(IE)]><!-->
是一种使 XHTML 有效的技巧,其中条件内容由任何非 IE 浏览器解析。 Heritrix 可以通过使 RELEVANT_TAG_EXTRACTOR 不将 <!-->
视为注释开始来修复。这应该有效:
static final String RELEVANT_TAG_EXTRACTOR = "(?is)<(?:((script[^>]*+)>.*?</script)" + // 1, 2 "|((style[^>]*+)>.*?</style)" + // 3, 4 "|(((meta)|(?:\w{1,"+MAX_ELEMENT_REPLACE+"}))\s+[^>]*+)" + // 5, 6, 7 "|(!--(?!\[if|>).*?--))>"; // 8
您始终可以编译 java class 继承 org.archive.modules.extractor.ExtractorHTML 并使用您的 class 代替原始的 ExtractorHTML。