【发布时间】:2017-03-07 13:55:16
【问题描述】:
我正在尝试找到一个合适的正则表达式来解析 robots.txt 文件。
所以我正在做的是将页面变成一个看起来像这样的字符串,例如:
User-agent: *
Disallow: /a
Disallow: /b/c
Disallow: /d/c/h
User-agent: agent1
Disallow: /a1/c1
Disallow: /b1/d1
User-agent: agent2
Disallow: /a2/c2
Disallow: /b2/d2
所以我要做的是创建一个 regex 来为每个用户代理获取代理名称 (*,agent1,agent2) 及其禁止列表。
这是我尝试过的代码,但没有得到预期的结果:
public void parseRobotsTxt() {
String website = "http://http://www.EXAMPLE.com";
String content = PageUtils.getStringSource(website + "/robots.txt");
Pattern pattern = Pattern.compile(".*?User-agent:(.*?)(Disallow:(.*?))",Pattern.DOTALL);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("The user agent:" + matcher.group(1));
System.out.println("Disallow List: ");
System.out.println("The user agent:" + matcher.group(2));
System.out.println("----------------------");
}
}
不幸的是我得到的结果是
The user agent: *
Disallow List:
Disallow:
----------------------
The user agent: agent1
Disallow List:
Disallow:
----------------------
The user agent: agent2
Disallow List:
Disallow:
----------------------
我得到的是代理名称,但不是禁止列表。
【问题讨论】:
-
会不会更容易:按换行符拆分 - 检查第一行是否以
User-agent:开头并将其提取 - 而行以Disallow开头将它们添加到您的记录中 - 当一个空满足线,开始新记录? -
String#split 不会更容易吗?您可以获取每个用户代理的数组并解析剩余的文本。
-
请原谅我的油嘴滑舌,但“two problems” quote 似乎与此相关。无需正则表达式即可轻松完成此解析。
-
为什么是正则表达式?您可以以不同的方式为此使用正则表达式,但您需要其中的几个。你也忽略了
Allow:。
标签: java regex web-crawler robots.txt