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。