2010-04-03 118 views
2

我試圖解析一些返回的html(從http://www.google.com/movies?near=37130)尋找當前正在播放的電影。我試圖匹配的模式看起來像:
<span dir=ltr>Clash of the Titans</span>ruby​​正則表達式,解析html

其中有幾個在返回的HTML。

我試圖讓電影標題的使用下面的命令的數組:
titles = listings_html.split(/(<span dir=ltr>).*(<\/span>)/)

但我沒有得到我期望的結果。任何人都可以看到我的方法或正則表達式的問題?

+1

請參閱http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-04-03 15:34:55

+3

此外,這個問題可能只是最糟糕的格式化問題永遠! – 2010-04-03 15:35:28

+0

事情是,如果我不在代碼中發佈每一個小評論,總會有人嘮叨。所以我只是想避免這種情況。 – danwoods 2010-04-03 16:13:05

回答

5

一般認爲Verey Bad會用RegEx解析HTML,因爲HTML沒有正則語法。見解釋鏈接列表(一些來自SO)here

您應該使用指定的HTML庫,such as this

3

要使用Ruby解析HTML,用Nokogirihpricot

+0

我肯定會使用hpricot,它非常易於使用。這裏的自述文件中有很好的文檔http://github.com/whymirror/hpricot – Jamie 2010-04-03 16:27:19

+0

而且我肯定會使用Nokogiri,因爲它能夠處理hpricot嘔吐的格式錯誤的XML。 :-) http://nokogiri.org/ – 2010-04-04 00:50:04

+0

@Jamie,在這兩者中,我也推薦Nokogiri。 – 2010-04-04 01:12:18

4

我沒看過你貼的整個代碼,因爲它燒了我的眼睛。

<span>.*</span> 

此正則表達式匹配<span>hello</span>正確的,但在<span>hello</span><span>there</span>失敗,整個字符串匹配。請記住,*運算符是貪婪的,所以它會匹配儘可能長的字符串。你可以通過使用.*?來使它非貪婪。

但是,使用正則表達式解析HTML代碼並不明智。

1-你不能總是用正則表達式解析HTML。 HTML不規則。

2-編寫或維護正則表達式非常困難。

3-很容易通過使用像<span><a href="</span>"></a></span>這樣的輸入來打破正則表達式。

2

(它不會出現,你實際上張貼的樣本HTML有你想匹配的模式的任何例子。)

艾麗西亞是正確的,對HTML正則表達式通常是一個壞主意,並作爲你的要求變得更復雜,它會崩潰。

這就是說,你的榜樣是很簡單..

doc.scan(/<span dir=ltr>(.*)<\/span/) do |match| 
    puts match    
end 

如前所述,*通常是貪婪(我預計將有以考慮),但現在看來,掃描中使用時,你不會變得貪婪的行爲。我能夠在單個文檔中匹配多個這些模式。