Heritrix在条件注释块中找不到CSS文件

时间:2015-06-18 10:19:09

标签: java web-crawler heritrix

问题/证据

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错误,还是我们可以用爬虫豆声明解决的问题?我知道评论区块是&#34; trick&#34;某些浏览器版本,并且不能更改网站代码。 Heritrix可以适应否定评论吗?

1 个答案:

答案 0 :(得分:2)

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浏览器解析。可以通过使RELEVANT_TAG_EXTRACTOR不将<!-->视为注释开始来修复Heritrix。这应该有效:

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。