基于Source和正则表达式的Scala网页内容抓取

转载 2015年11月21日 17:31:22


2012年08月04日 ⁄ 综合⁄ 共 1183字 ⁄ 字号 评论关闭

初学Scala,写个简单的抓取作为练手。

网页内容的抓取使用了Scala标准库的Source,网页内容的提取使用了正则表达式。中间练习了集合类的一些操作和文件读写操作,对正则表达式也重温了一下,特别是跨行匹配(多行匹配)研究了一些时间。提取后的文本写在了文件中。在Ubuntu 10.04 和 Scala 2.10.0 下运行成功。

代码如下:

import java.io._

def getIndex() = {
    val indexSource = scala.io.Source.fromURL("http://www.yifan100.com/dir/15136/").mkString
    val indexRegex = """<a target="_blank" href="(.+\.html)" title=".+" >(.+)</a>""".r
    (List[(String, String)]() /: indexRegex.findAllMatchIn(indexSource).toList) { (result, item) =>
        ("http://www.yifan100.com" + (item group 1), item group 2) :: result
    } // return List[(url:String, title:String)]
}

def getContent(url:String) = {
    val raw = scala.io.Source.fromURL(url).mkString
    val reg = """(?s).*<div class="artcontent">(.*)<div id="zhanwei">.*""".r
    (reg findFirstMatchIn raw).map[String](item => {
            val s = (item group 1).replaceAll("<br>", "\r\n").
                replaceAll("""(?s)</?.*?>""", "").
                replaceAll("""^\s+""", "").
                replaceAll(" ", " ")
            s
        }
    ) // return Option[String]
}

def writeContent(content:Option[String], title:String) {
    if(content.isEmpty)
        println("Not write " + title + ".txt")
    else {
        val writer = new PrintWriter(new File(title + ".txt"))
        writer write content.get
        writer.close()
        println("Write " + title + ".txt")
    }
}

def getIt() {
    getIndex().foreach(item => writeContent(getContent(item._1), item._2))
}

getIt()

Scala 读取网页数据测试及备忘

最近在学习Scala,发现Scala确实很简洁、强大。用Scala居然可以直接像打开本地文件一样读取网页内容,确实很方便,但是稍不注意也会容易出错。以下就是我的学习记录:     Scala中文件读...
  • dai451954706
  • dai451954706
  • 2015年11月11日 22:52
  • 496

Scala的正则表达式regex操作

 9.   misc 9.1.     json Scala-json 9.2.     Configgy http://www.lag.net/configgy/ ...
  • Rocky_wangjialin
  • Rocky_wangjialin
  • 2014年10月16日 12:20
  • 4800

Scala入门到精通——第十二节 I/O与正则表达式

本节主要内容 Scala I/O操作简介 Scala 写文件 Scala 读文件 Scala 网络I/O 正则表达式简介 Scala正则表达式实战 1. Scala I/O操作简介I/O操作是一门编程...
  • lovehuangjiaju
  • lovehuangjiaju
  • 2015年07月26日 16:28
  • 15302

sourceinsight中使用正则表达式

转载自: http://blog.sina.com.cn/s/blog_6826866101014bpd.html http://blog.chinaunix.net/uid-11278770...
  • cenzmin
  • cenzmin
  • 2016年04月26日 16:47
  • 1274

scala 正则表达式

正则表达式是所有攻城狮尤其是算法,数据相关攻城狮必备的技能。日常工作中免不了处理各种字符串与字符串操作,写好正则表达式能大幅度提高工作效率,提升工作愉悦度。现在就简单总结一下scala中常见的正则表达...
  • bitcarmanlee
  • bitcarmanlee
  • 2017年05月23日 11:32
  • 734

Scala中正则表达式以及与模式匹配结合

正则表达式 //"""原生表达 val regex="""([0-9]+)([a-z]+)""".r val numPattern="[0-9]+".r val numb...
  • yizheyouye
  • yizheyouye
  • 2015年10月17日 15:45
  • 6558

scala之正则表达式(一)基础匹配

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组 成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。给定一个正则表达式和另一个字符...
  • legotime
  • legotime
  • 2016年08月02日 20:29
  • 9799

Scala教程(九)正则表达式

什么是正则表达式:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。正则表达式规定的一个特殊...
  • yuan_xw
  • yuan_xw
  • 2015年09月23日 17:46
  • 2105

scala之正则表达式(二)内部匹配函数

1、scala处理正则表达式步骤 以下面表达为例: val dateP1 = new scala.util.matching.Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""",...
  • legotime
  • legotime
  • 2016年08月02日 20:30
  • 1599

Scala基础教程(八):模式匹配、正则表达式

匹配使用case 类: case classes是用于模式匹配与case 表达式指定类。这些都是标准类具有特殊修饰:case。下面是一个简单的模式使用case class匹配示例: object ...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年12月10日 12:38
  • 3290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Source和正则表达式的Scala网页内容抓取
举报原因:
原因补充:

(最多只允许输入30个字)