【问题标题】:Extract urls from string with type从具有类型的字符串中提取 url
【发布时间】:2011-12-07 17:50:13
【问题描述】:

我正在尝试从字符串中提取 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/")
)

我已经研究过正则表达式,但只是在没有定义类型的情况下提取了 href,而且这也不会在标签之外自行检索 url

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

非常感谢任何帮助,在此先感谢:)

【问题讨论】:

  • 你应该使用像 jsoup 这样的 HTML 解析器。
  • 谢谢Kim,你知道有什么文章可以让我开始吗?依赖项、导入等?

标签: regex url scala hyperlink lift


【解决方案1】:

假设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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2011-05-22
    • 2022-01-08
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多