1

问题/证据

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 错误,还是我们可以通过爬虫声明解决的问题?我知道评论块是用来“欺骗”某些浏览器版本的,更改网站代码不是一种选择。Heritrix 可以适应否定评论吗?

4

1 回答 1

1

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

基本上,case 1 .. 7 匹配任何有趣的链接提取标签,case 8 匹配 HTML 注释以丢弃它们。如您所见,案例 8 小心地避免匹配表单中的注释<!--[if ... -->,以便它们不会被丢弃。因此,在您的特定情况下,后面的<!-->内容被匹配为起始注释,并且它被丢弃到最后一个-->.

<!--[if (gt IE 8)|!(IE)]><!-->是在条件内容由任何非 IE 浏览器解析的情况下生成有效 XHTML 的技巧。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。

于 2015-06-18T18:54:08.507 回答