2014-02-21 3 views
-2

Обновление: я использую Jsoup для разбора текста
При анализе одного сайта я столкнулся с проблемой: когда я получаю html-текст, некоторые ссылки повреждены пространством в случайном месте. Например:Измените сложную строку с неизвестной подстрокой

What a pretty flower! <a href="www.goo gle.com/...">here</a> and <a href="w ww.google.com...">here</a> 

Как вы можете заметить, положение пространства совершенно случайно, но одна вещь наверняка: это внутри href тега. Конечно, я могу использовать метод replace(" ", ""), но могут быть две или более ссылки. Как я могу решить эту проблему?

+2

Что не так с использованием 'replace (" "," ")' для всех значений href? Кроме того, зачем пытаться исправить данные с сайта, который возвращает мусор? –

+0

Существует также регулярное выражение, которое вы можете использовать для идентификации ваших ссылок, если вы хотите использовать их только «replace». Или [JSoup] (http://jsoup.org/) (см. [Этот вопрос] (http://stackoverflow.com/questions/9071568/parse-web-site-html-with-java)) – eebbesen

+0

Да, я Я использую Jsoup для разбора, но изменение подстроки не изменит исходную строку, не так ли? – Groosha

ответ

1

Это своего рода старое решение, но я бы попытался использовать старый выведенный из системы apache ECS для анализа вашего html, а затем, только для ссылок href, вы могли бы удалить пробелы, а затем снова создать все :-) Если я хорошо помню, был способ разобрать ECS «DOM» из html.

http://svn.apache.org/repos/asf/jakarta/ecs/branches/ecs/src/java/org/apache/ecs/html2ecs/Html2Ecs.java 

Другой вариант заключается в выборочном получить ваши hrefs используя что-то вроде XPath, но вам придется иметь дело с искаженной HTML (вы могли бы дать кругленькую шанс - http://infohound.net/tidy/)

+0

Я попробую, thnx – Groosha

0

Вы можете использовать регулярные выражения найти и «уточнить» URL-адреса:

public class URLRegex { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     final String INPUT = "Hello World <a href=\"http://ww w.google.com\">Google</a> Second " + 
          "Hello World <a href=\"http://www.wiki pedia.org\">Wikipedia</a> Test" + 
          "<a href=\"https://www.example.o rg\">Example</a> Test Test"; 
     System.out.println(INPUT); 

     // This pattern matches a sequence of one or more spaces. 
     // Precompile it here, so we don't have to do it in every iteration of the loop below. 
     Pattern SPACES_PATTERN = Pattern.compile("\\u0020+"); 

     // The regular expression below is very primitive and does not really check whether the URL is valid. 
     // Moreover, only very simple URLs are matched. If an URL includes different protocols, account credentials, ... it is not matched. 
     // For more sophisticated regular expressions have a look at: http://stackoverflow.com/questions/161738/ 
     Pattern PATTERN_A_HREF = Pattern.compile("https?://[A-Za-z0-9\\.\\-\\u0020\\?&\\=#/]+"); 
     Matcher m = PATTERN_A_HREF.matcher(INPUT); 

     // Iterate through all matching strings: 
     while (m.find()) { 
      String urlThatMightContainSpaces = m.group(); // Get the current match 
      Matcher spaceMatcher = SPACES_PATTERN.matcher(urlThatMightContainSpaces); 
      System.out.println(spaceMatcher.replaceAll("")); // Replaces all spaces by nothing. 
     } 

    } 
} 
+0

Hmm..looks перспективный – Groosha

Смежные вопросы