如何优化这个丑陋的代码?

时间:2010-07-31 21:03:25

标签: java string web-crawler

我前几天问here,但最后我决定自己做一些时间问题,现在我有更多的时间来解决它:DI喜欢jSoup,但我有点儿从旧学校开始,并为自己做好了(感谢@Bakkal)。

我设法制作了这段代码,它现在运行正常,但是如果网页构造不好,它会破坏代码,例如,如果它不以http开头,代码就不会找到它,并且如果网址没有以我放入的内容之一结束,那么它将返回一个非常丑陋的地址..例如

  

http://www.google.com/嘿老兄怎么样   你是?很棒,在杰克吃饭

我的结果将是:

  

http://www.google.com/嘿老兄怎么样   你是?太棒了,吃着杰克

我愿意接受任何建议,我会恢复我的问题,之后我会发布代码

  1. 如果我没有确切的结尾,则代码会中断
  2. 如果我将空格“”作为休息时间,我将会松开地址中有空格的所有页面
  3. 我想捕获所有地址,不仅仅是以http开头的地址,例如www.google.com是有效地址,所以contacts.google.com
  4. 谢谢你的一切:D

    File txtUrlSpecialFile = new File("pepe.txt");
                FileWriter txtUrlSpecial;
                txtUrlSpecial = new FileWriter(txtUrlSpecialFile);
                txtUrlSpecial.write(profundidad-1);
    
                for(int j=0;j<bigString.length()-5;j++){ //I put 5 but I can put more
                    if(bigString.substring(j, j+4).equals("http")){
                        while(bigString.charAt(j)!='"' && bigString.charAt(j)!='<'&& bigString.substring(j, j)!="'"){
                            txtUrlSpecial.write(bigString.charAt(j));
                            j++;
                        }
                        txtUrlSpecial.write(SingletonFunction.getNewLine());
                    }
                }
                txtUrlSpecial.close();
    

2 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您正试图从两个属性(例如“href”)和文本中尝试从HTML文件中提取URL。

  • 您希望它与格式错误的HTML一起使用
  • 您希望它与格式错误的网址一起使用;例如包含空格的网址
  • 你不希望它犯任何错误;例如你的榜样。

我告诉你,你的要求是不可能的。例如,从以下文本中提取应该

Go to the URL http://example.com/ this and that.  And if that doesn't work, 
I recommend that you go read the http specification.

“this and that”应该是URL的一部分吗?你的软件应该如何解决这个问题呢?如果该文档的作者与您的启发式说法相反,该怎么办?那么“http规范”......显然不是一个URL。

这是另一个更微妙的例子:

First, go to the URL http://example.com/index.html.
Then click on the "login" link.

您的软件是否应该提取“http://example.com/index.html”。还是“http://example.com/index.html”?根据URL规范,两者都是有效的URL。你的软件可能会剥离最后的“。”因为它最有可能是标点符号,但可能错误。

我的建议:

  1. 不要认为你可以比现有的宽容HTML解析器做得更好。你来自哪里,你可能接近于零。
  2. 不要认为您的软件不会出错。 100%的准确性要求您的软件可以读取创建文件的人的想法。 (并且可以说,即使这还不够。)
  3. 注意网址的显示背景。您需要使用不同的启发式方法从HTML属性和文本中提取URL。
  4. 请注意究竟是什么,以及什么不是合法网址。
  5. 完全阅读并理解HTML和URL / URI规范的所有相关部分。虽然使用格式错误的文档可能会出错,但如果无法从格式良好的HTML文档的属性中提取格式良好的URL,那将是不可原谅的。

答案 1 :(得分:0)

John Gruber有一个很好的正则表达式,用于查找纯文本的URL:请参阅An Improved Liberal, Accurate Regex Pattern for Matching URLs

总是存在歧义,但约翰的正则表达式在现实生活中的表现非常出色。