2012-01-09 3 views
3

Я недавно взял на общинной вызов, и я пытаюсь извлечь значение тега «отн» в следующей строке:Извлечение значения из атрибута HTML тегов в Java

<td><a title='Visit Personal Stats Page for ijackk' href='personal.php?name=ijackk&amp;clan=ph_chat_ftw' class='rsn' rel='ijackk' style='color: #FFFFFF;'>ijackk</a></td>

причина для этого - вызов, требующий от меня удалить имена нескольких пользователей из списка участников (список людей с атрибутами, относящимися к их учетной записи). У меня нет У меня есть, чтобы использовать регулярные выражения, но я чувствую, что это было бы лучше. Я видел классический пост, почему регулярные выражения плохи, но я также видел сообщения о том, что использование его для подобных вещей не так уж плохо.

Ниже то, что я делал до сих пор:

public class Parser { 

public static void main(String[] arguments) { 
    new Parser().parse(); 
} 

public void parse() { 
    try { 
     URL url = new URL("http://www.runehead.com/clans/ml.php?clan=ph_chat_ftw"); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); 
     String line; 
     StringBuilder stringBuilder = new StringBuilder(); 
     while ((line = bufferedReader.readLine()) != null) { 
      if (line.contains("Visit")) { 
       stringBuilder.append(line).append("\n"); 
       System.out.println(line); 
      } 
     } 
     Matcher matcher = Pattern.compile("\\?rel='([A-Za-z0-9_]*)'").matcher(stringBuilder.toString()); 
     while (matcher.find()) { 
      System.out.println("matched: " + matcher.group(1)); 
     } 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

Вывод о том, что у меня там то, что я представил выше, для каждого имени, за исключением. Соединитель ничего не находит. Могу я помочь?

ответ

2

Вы считаете, что атрибут rel сразу следует за ?, но это не обязательно так. Вы можете использовать следующее:

Pattern.compile("rel=\"([A-Za-z0-9_]*)\"") 

Это, конечно, работает, но, как уже говорили другие, вы лучше использовать правильный HTML-парсер. Вот jsoup пример:

Document doc = Jsoup.connect(
    "http://www.runehead.com/clans/ml.php?clan=ph_chat_ftw").get(); 
Elements users = doc.select("a[rel]"); 
for (Element user : users) { 
    System.out.println(user.attr("rel")); 
} 

Это намного чище (и безопаснее (и более гибкими (и ремонтопригодны))), чем ваш регулярных выражений подхода.

+0

Спасибо! Это намного чище, и он отлично работает! –

2

Используйте подходящую библиотеку разбора HTML. Я предпочитаю jSoup, но есть и многие другие.

Использование RegEx для анализа HTML гораздо больнее, чем в большинстве случаев. Не только это трудно сделать в первую очередь, но все, что вы придумали, что делает работы, вероятно, будет , поэтому свернуто, что он будет по существу полностью недостижим.


Here's an example с помощью jSoup, чтобы получить атрибут rel:

String html = "<p>An <a href='http://example.com/' rel='someValue'><b>example</b></a> link.</p>"; 
Document doc = Jsoup.parse(html); 
Element link = doc.select("a").first(); 

String text = doc.body().text(); // "An example link" 
String linkRel = link.attr("rel"); // "someValue" 
+0

Я раньше искал эту библиотеку и не нашел никакой реализации для того, что искал. Могли бы вы так любезны привести пример? Буду признателен. –

+1

Благодарим вас за пример. Когда я использую его, он отлично работает!Единственная проблема заключается в том, что это печать, как это: 'Sanyboi Sanyboi Shes надежду Sanyboi Shes надежду raeiden Sanyboi Shes надежду raeiden E1itez Sanyboi Shes надежду raeiden E1itez krunal930' весь путь через документ. Любой способ распечатать их один за другим (или помещать их в ArrayList, каждый индекс имеет имя)? Edit: nevermind Я делал это, читая данные Это отлично, спасибо вам большое! –

2

Regex и HTML, вместе взятых, бранные слова здесь. Регулярные выражения не очень хороши при анализе нестойкой разметки, такой как HTML или XML.

Для этого вам, вероятно, будет лучше использовать библиотеку парсера HTML. Кто-то, похоже, сделал это именно здесь, в метко названном HTML Parser library.

EDIT: - Или jSoup тоже может работать. Там много выбора!

+0

Спасибо за ваш вклад! –

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