问题/证据
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可以适应否定评论吗?
答案 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。