gpt4 book ai didi

c# - 将一个非常 Python 风格的库移植到 .NET

转载 作者:太空狗 更新时间:2023-10-30 01:35:03 25 4
gpt4 key购买 nike

我正在研究移植 Python 库的可能性 Beautiful Soup转到.NET。主要是因为我真的很喜欢解析器,而且 .NET 框架上根本没有好的 HTML 解析器(Html Agility Pack 已经过时、有缺陷、没有文档记录,并且除非知道确切的架构,否则不能正常工作。)

我的主要目标之一是让基本的 DOM 选择功能真正与 BeautifulSoup 的美观和简单相提并论,让开发人员能够轻松地制作表达式来找到他们正在寻找的元素。

BeautifulSoup 利用松散绑定(bind)和命名参数来实现这一点。例如,查找所有 idtesttitle 包含单词 a 标签>foo,我可以:

soup.find_all('a', id='test', title=re.compile('foo'))

但是,C# 没有任意数量的命名元素的概念。 .NET4 运行时具有命名参数,但它们必须与现有方法原型(prototype)相匹配。

我的问题:与这种 Pythonic 结构最相似的 C# 设计模式是什么?

一些想法:

作为一名开发人员,我想根据自己喜欢的编码方式来追求这一点。实现它超出了本文的范围。我的一个想法是使用匿名类型。像这样的东西:

soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") });

虽然这种语法与 Python 实现大致匹配,但它仍然有一些缺点。

  1. FindAll 实现必须使用反射来解析匿名类型,并以合理的方式处理任意元数据。
  2. FindAll 原型(prototype)需要一个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 代码。

关于c# - 将一个非常 Python 风格的库移植到 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com