go爬蟲:正則表達式及第三方庫

1、正則表達式抓取

//好比找到全部的a連接
//注意匹配模式在最前面的 (?m),加了多行匹配模式後,點號不能匹配換行符
pattern := `(?msU)<a.*href="(.*)".*>(.*)</a>`
reg = regexp.MustCompile(pattern)
match := reg.FindAllStringSubmatch(html, -1)  //FindAllStringSubmatch會將捕獲到的放到子slice
if match != nil {
       fmt.Print("%#v", match)
}

go正則:http://studygolang.com/static/pkgdoc/pkg/regexp.htm css

具體參考:https://github.com/google/re2/wiki/Syntax 這裏能夠看到不少字符含義:html

[[:alnum:]] alphanumeric (≡ [0-9A-Za-z])
[[:alpha:]] alphabetic (≡ [A-Za-z])
[[:ascii:]] ASCII (≡ [\x00-\x7F])
[[:blank:]] blank (≡ [\t ])
[[:cntrl:]] control (≡ [\x00-\x1F\x7F])
[[:digit:]] digits (≡ [0-9])
[[:graph:]] graphical (≡ [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])
[[:lower:]] lower case (≡ [a-z])
[[:print:]] printable (≡ [ -~] == [ [:graph:]])
[[:punct:]] punctuation (≡ [!-/:-@[-`{-~])
[[:space:]] whitespace (≡ [\t\n\v\f\r ])
[[:upper:]] upper case (≡ [A-Z])
[[:word:]] word characters (≡ [0-9A-Za-z_])
[[:xdigit:]] hex digit (≡ [0-9A-Fa-f])

不少用法不支持,好比反向引用,斷言什麼的jquery

正則表達式採用RE2語法(除了\c、\C),和Perl、Python等語言的正則基本一致。因此搜索看Perl或者Python看便可,好比修飾符的使用。git

前面就交代了修飾符等等,其中U修飾符是開啓非貪婪模式(即替換.*爲.*?),表達式中只須要寫 .* 便可github

go的修飾符:golang

pattern := `(?Um)...`
     (re)           編號的捕獲分組
        (?P<name>re)   命名並編號的捕獲分組
        (?:re)         不捕獲的分組
        (?flags)       設置當前所在分組的標誌,不捕獲也不匹配
        (?flags:re)    設置re段的標誌,不捕獲的分組
        I              大小寫敏感(默認關閉)
        m              ^和$在匹配文本開始和結尾以外,還能夠匹配行首和行尾(默認開啓)
        s              讓.能夠匹配\n(默認關閉)
        U              非貪婪的:交換x*和x*?、x+和x+?……的含義(默認關閉)

正則基本知識:https://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.90).aspx  web

http://louiszhai.github.io/2016/06/13/regexp/正則表達式

非貪婪模式: .*?ui

匹配模式修飾符:通常4種模式,不區分大小寫模式i,單行模式s,多行模式m,註釋模式google

注意點號沒法匹配到換行符(就算是多行匹配也不行),解決方案就是在模式修飾符中再加入s(單行模式,將換行符視爲普通字符,.號能夠匹配到),或者將 .*? 換成 [\s\S]*?

參考:http://m.oschina.net/blog/370714

 

2、第三方庫

goquery,讓go像jquery同樣抓取網頁:

https://github.com/PuerkitoBio/goquery

css選擇器備忘

相關文章
相關標籤/搜索