java - Heritrix 在条件注释 block 中找不到 CSS 文件

标签 java web-crawler heritrix

问题/证据

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/

相关文章:

java - 当我尝试删除冗余文件时,即使在关闭所有引用之后,jvm 也会抛出 FileSystemException

Java 到 Excel - 动态更新

java - SpringLayout 问题/挑战

java - 我们如何使用Java搭建一个网站爬虫

linux - 无法在 Heritrix3 Web Crawler 中运行并行作业

java - 我怎样才能使 URLEncoding 不编码冒号?

html - 使用 xpath 从表中抓取和提取数据

ruby - 使用 Mechanize 检索网站的所有链接

java - 如何将 maven.xml 升级为 pom.xml?