移植一个非常pythonesque库到.NET

我正在研究将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#,或在处理这种情况的最好方法只是总的建议感激任何见解。

回答:

您是否尝试在IronPython引擎内运行代码?据我所知,表现非常好,你不必碰触你的Python代码。

以上是 移植一个非常pythonesque库到.NET 的全部内容, 来源链接: utcz.com/qa/263247.html

回到顶部