提问者:小点点

scala正则表达式在网页上查找img src


我正在尝试使用Scala正则表达式在网页中查找imgsrc。使用以下代码和模拟内容,我没有得到任何匹配。我错过了什么?

def imgSrc(content: String) = {
  val src = ".*<img[\\w\\s]+src\\s*=\\s*(\"\\w+\")[\\w\\s]+/>.*".r
  val formattedContent = content.replaceAll(lineSeparator, "")

  (src findAllIn formattedContent).toList
}

测试用例:

"Method imgSrc" should "find src attributes of all img tags in mock web page" in {
  val content = """<a href="#search" onclick="_gaq.push(['_trackPageview', '/search']); 
                    return Manager.createHistoryAndLoad(true);">
                    <img src="ajaxsolr/images/centralRepository_logo.png" alt="The Central Repository" />
                  </a>"""
  imgSrc(content) should contain("ajaxsolr/images/centralRepository_logo.png")
}

另外,如果能够在不删除换行符的情况下匹配多行输入,那就太好了。我读了这本和这本,但没能让它发挥作用。

注意:这只是一个学习练习。我知道并且普遍同意不应该使用正则表达式来解析HTML。


共1个答案

匿名用户

这对您的输入有效:

scala> def imgSrc(content: String) = {
     |   val src = """(?s)<img\s[^>]*?src\s*=\s*['\"]([^'\"]*?)['\"][^>]*?>""".r
     |   src findAllMatchIn content map (_.group(1)) toList
     | }
imgSrc: (content: String)List[String]

scala> imgSrc(content)
res13: List[String] = List(ajaxsolr/images/centralRepository_logo.png)

但我建议您使用一些普通的HTML解析器,如Jsoup:

 val doc = Jsoup.parse(content);
 val img = doc.select("img").first();
 val src = img.attr("src");