我正在调查将Python库Beautiful Soup移植到.NET的可能性。主要是因为我真的很喜欢解析器而且.NET框架上根本没有好的HTML解析器(Html Agility Pack已经过时,错误,没有文档,除非确切的模式已知,否则效果不佳。)
我的主要目标之一是让基本的DOM选择功能真正与BeautifulSoup的美观和简洁相媲美,使开发人员能够轻松地创建表达式以找到他们正在寻找的元素。
BeautifulSoup利用松散绑定和命名参数来实现这一点。例如,要查找所有a
代码与一个id
的{{1}}和test
包含单词的富的,我可以这样做:< / p>
title
但是,C#没有任意数量的命名元素的概念。 .NET4 Runtime已命名参数,但它们必须匹配现有的方法原型。
我的问题:与Pythonic构造最相似的C#设计模式是什么?
一些想法:
我想基于我作为开发人员想要编码的方式来追求这一点。实现这一点超出了本文的范围。我的一个想法是使用匿名类型。类似的东西:
soup.find_all('a', id='test', title=re.compile('foo'))
虽然这种语法与Python实现松散匹配,但它仍有一些缺点。
soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") });
实现必须使用反射来解析匿名类型,并以合理的方式处理任意元数据。FindAll
原型需要采用FindAll
,这使得如何使用该方法还不太清楚,除非您熟悉记录的行为。我不相信有一种方法可以声明必须采用匿名类型的方法。我的另一个想法可能是更多的.NET处理方式,但是远离库的Python根源。那就是使用流畅的模式。类似的东西:
Object
这需要构建表达式树并在DOM中定位适当的节点。
我的第三个也是最后一个想法是使用LINQ。类似的东西:
soup.FindAll("a")
.Attr("id", "Test")
.Attr("title", new Regex("foo"));
我很感激任何有经验将Python代码移植到C#的人的见解,或者只是关于处理这种情况的最佳方法的总体建议。
答案 0 :(得分:1)
您是否尝试在IronPython引擎中运行代码?据我所知,表现非常好,你不必触摸你的python代码。