将一个非常Pythonesque库移植到.NET

时间:2012-05-03 15:57:29

标签: c# python beautifulsoup

我正在调查将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实现松散匹配,但它仍有一些缺点。

  1. soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") }); 实现必须使用反射来解析匿名类型,并以合理的方式处理任意元数据。
  2. FindAll原型需要采用FindAll,这使得如何使用该方法还不太清楚,除非您熟悉记录的行为。我不相信有一种方法可以声明必须采用匿名类型的方法。
  3. 我的另一个想法可能是更多的.NET处理方式,但是远离库的Python根源。那就是使用流畅的模式。类似的东西:

    Object

    这需要构建表达式树并在DOM中定位适当的节点。

    我的第三个也是最后一个想法是使用LINQ。类似的东西:

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

    我很感激任何有经验将Python代码移植到C#的人的见解,或者只是关于处理这种情况的最佳方法的总体建议。

1 个答案:

答案 0 :(得分:1)

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