移植一个非常pythonesque库到.NET
我正在研究将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#,或在处理这种情况的最好方法只是总的建议感激任何见解。
回答:
您是否尝试在IronPython引擎内运行代码?据我所知,表现非常好,你不必碰触你的Python代码。
以上是 移植一个非常pythonesque库到.NET 的全部内容, 来源链接: utcz.com/qa/263247.html