Извлечение URL из строки с типом - PullRequest
3 голосов
/ 14 октября 2011

Я пытаюсь извлечь URL-адреса из строки, они не стандартизированы, поэтому некоторые из них находятся внутри тегов href, другие - сами по себе.

Также мне нужно, чтобы они были отсортированы по типу, например, следующие строки:

var txt1: String = "Some text! <a href="http://www.google.com/test.mp3">MP3</a>"
var txt2: String = "Some text! <a href="http://www.google.com/test.jpg">IMG</a>"
var txt3: String = "Some more! <a href="http://www.google.com/">Link!</a>"

Итак, все эти строки объединены и содержат 3 URL, я ищу что-то вроде:

var result: List = List(

    "mp3" -> List("http://www.google.com/test.mp3"),
    "img" -> List("http://www.google.com/test.jpg"),
    "url" -> List("http://www.google.com/")
)

Я изучил регулярные выражения, но дошел до того, что извлекал hrefs без определения типов, и это также не позволяет получать URL-адреса самостоятельно вне тегов

val hrefRegex = new Regex("""\<a.*?href=\"(http:.*?)\".*?\>.*?\</a>""");
val hrefs:List[String]= hrefRegex.findAllIn(txt1.mkString).toList;

Любая помощь высоко ценится, заранее спасибо:)

1 Ответ

5 голосов
/ 14 октября 2011

Предполагая val txt = txt1 + txt2 + txt3, вы можете обернуть текст в элемент xml в виде строки, затем проанализировать его как XML и использовать стандартную библиотеку xml для извлечения якорей.

// can do other cleanup if necessary here such as changing "link!"
def normalize(t: String) = t.toLowerCase()

val txtAsXML = xml.XML.loadString("<root>" + txt + "</root>")
val anchors = txtAsXML \\ "a"
// returns scala.xml.NodeSeq containing the <a> tags

Тогда вам просто нужно опубликовать процесс, пока данные не будут организованы так, как вы хотите:

val tuples = anchors.map(a => normalize(a.text) -> a.attributes("href").toString)
// Seq[String, String] containing elements
// like "mp3" -> http://www.google.com/test.mp3

val byTypes = tuples.groupBy(_._1).mapValues(seq => seq.map(_._2))
// here grouped by types:
// Map(img -> List(http://www.google.com/test.jpg), 
//     link! -> List(http://www.google.com/),
//     mp3 -> List(http://www.google.com/test.mp3))
...