问题/证据
Heritrix 未检测到在一个字符串中打开和关闭的条件注释中是否存在文件,如下所示:
<!--[if (gt IE 8)|!(IE)]><!-->
<link rel="stylesheet" href="/css/mod.css" />
<!--<![endif]-->
但是像这样的标准条件 block 工作正常:
<!--[if lte IE 9]>
<script src="/js/ltei9.js"></script>
<![endif]-->
我已经确定问题出在评论的这一部分:
<!-->
在测试用例中删除该 block 然后允许 Heritrix 发现 css 文件。
问题
我应该如何克服这个问题?这是一个 Heritrix bug,还是我们可以通过crawler-beans 声明来解决这个问题?我知道评论 block 是为了“欺骗”某些浏览器版本,并且更改网站代码不是一个选项。 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 匹配任何感兴趣的链接提取标签,情况 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
您始终可以通过修复来编译继承 org.archive.modules.extractor.ExtractorHTML 的 java 类,并使用您的类代替原始的 ExtractorHTML。
关于java - Heritrix 在条件注释 block 中找不到 CSS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30912661/