我正在研究將Python庫Beautiful Soup移植到.NET的可能性。主要是因爲我非常喜歡解析器,並且.NET框架上沒有好的HTML解析器(Html Agility Pack已經過時,越野車,沒有文檔,並且除非知道確切的架構,否則不能很好地工作)。我的主要目標是獲得基本的DOM選擇功能,以真正平行BeautifulSoup的美觀和簡單性,允許開發人員輕鬆製作表達式以找到他們正在尋找的元素。移植一個非常pythonesque庫到.NET
BeautifulSoup利用寬鬆綁定和命名參數來實現此目的。例如,要查找所有a
標籤與test
的id
和包含單詞富一個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實現,但它仍然有一些缺點。
FindAll
實現將不得不使用反射來解析匿名類型,並以合理的方式處理任何任意的元數據。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#,或在處理這種情況的最好方法只是總的建議感激任何見解。
就像我愛Python一樣 - 總是瞄準將使用它的觀衆。如果您正在爲.NET編寫它,請按照它們使用的樣式進行操作。看看現有的.NET庫,看看這些實踐是什麼(或者等待別人告訴你這裏)並使用它們 - 不要試圖匹配Python版本,你不使用Python。 –
我同意Lattyware。如果你想使用C#中的BeautifulSoup,你不能通過IronPyhon運行它嗎? – mata
這不是XPath的用途嗎? –