2012-05-03 38 views
5

我正在研究將Python庫Beautiful Soup移植到.NET的可能性。主要是因爲我非常喜歡解析器,並且.NET框架上沒有好的HTML解析器(Html Agility Pack已經過時,越野車,沒有文檔,並且除非知道確切的架構,否則不能很好地工作)。我的主要目標是獲得基本的DOM選擇功能,以真正平行BeautifulSoup的美觀和簡單性,允許開發人員輕鬆製作表達式以找到他們正在尋找的元素。移植一個非常pythonesque庫到.NET

BeautifulSoup利用寬鬆綁定和命名參數來實現此目的。例如,要查找所有a標籤與testid和包含單詞一個title,我可以這樣做:

soup.find_all('a', id='test', title=re.compile('foo')) 

然而,C#不具備的命名任意數量的概念元素。 .NET4運行時已命名參數,但它們必須匹配現有的方法原型。

我的問題:什麼是C#設計模式,大多數平行這個Pythonic構造?

一些建議:

我想根據我怎麼,作爲一個開發者,想代碼後,該走了。實現這個超出了這篇文章的範圍。我有一個想法是使用匿名類型。例如:

soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") }); 

雖然這個語法鬆散地匹配Python實現,但它仍然有一些缺點。

  1. FindAll實現將不得不使用反射來解析匿名類型,並以合理的方式處理任何任意的元數據。
  2. FindAll原型將需要採取Object,這使得它很不清楚如何使用該方法,除非您非常熟悉已記錄的行爲。我不相信有一種方法可以聲明必須採取匿名類型的方法。

我的另一個想法可能是更多的.NET方式來處理這個問題,但它遠離了圖書館的Python根源。這將是一個流利的模式。例如:

soup.FindAll("a") 
    .Attr("id", "Test") 
    .Attr("title", new Regex("foo")); 

這將需要構建表達式樹並在DOM中找到合適的節點。

我的第三個也是最後一個想法是使用LINQ。喜歡的東西:

var nodes = (from n in soup 
      where n.Tag == "a" && 
      n["id"] == "Test" && 
      Regex.Match(n["title"], "foo").Success 
      select n); 

我想任何人有經驗移植Python代碼C#,或在處理這種情況的最好方法只是總的建議感激任何見解。

+7

就像我愛Python一樣 - 總是瞄準將使用它的觀衆。如果您正在爲.NET編寫它,請按照它們使用的樣式進行操作。看看現有的.NET庫,看看這些實踐是什麼(或者等待別人告訴你這裏)並使用它們 - 不要試圖匹配Python版本,你不使用Python。 –

+0

我同意Lattyware。如果你想使用C#中的BeautifulSoup,你不能通過IronPyhon運行它嗎? – mata

+0

這不是XPath的用途嗎? –

回答

1

您是否嘗試在IronPython引擎內運行代碼?據我所知,表現非常好,你不必碰觸你的Python代碼。

+1

這是個好主意,但是我希望看到一個例子,說明在C#中使用命名參數調用Python實現的方法的樣子。 IronPython是否爲這種情況提供了一個互操作的故事?此外,這樣做基本上將這個問題轉到「如何在.NET中使用Python庫?」這並不是我所要求的。 –