铁蟒蛇,美丽的汤,win32应用程序

时间:2020-03-06 14:34:35  来源:igfitidea点击:

美丽的汤可以和铁蟒蛇一起工作吗?
如果是的话,哪个版本的铁蟒蛇?
使用铁python(主要是调用某些python代码来解析html)在.net 2.0上分发Windows桌面应用程序有多容易?

解决方案

我尚未对其进行测试,但是我想说它很可能可以与最新的IPy2一起使用。

至于分发,这很简单。使用-X:SaveAssemblies选项将Python代码编译为二进制文件,然后将其与其他DLL和IPy依赖项一起提供。

如果BeautifulSoup在IronPython上不起作用,那是因为IronPython无法实现整个Python语言(与CPython相同)。 BeautifulSoup是纯Python的,没有C扩展,因此唯一的问题是IronPython与CPython在Python源代码方面的兼容性。不应有一个,但是如果存在,则错误将显而易见("命名为...","无方法命名为..."等)。谷歌表示,只有BS的一项测试在IronPython上失败了。它可能有效,并且该测试可能现在已经修复。我不知道

尝试一下,看看这是我的建议,除非有人有更具体的建议。

我已经对BeautifulSoup进行了测试,并将它们与IPy 1.1和2.0一起使用(忘了哪个beta,但这已经是几个月了)。如果我们仍然遇到问题,请发表评论,我将挖掘出我的测试代码并将其发布。

如果我们拥有完整的标准库和真正的re模块(适用于IronPython社区版的Google),它可能会起作用。但是IronPython是一个令人难以置信的糟糕python实现,我不会指望这一点。

另外,尝试html5lib。该解析器使用相同的规则解析firefox解析文档。

关于问题的第二部分,我们可以使用DLR Hosting API在C应用程序中运行IronPython代码。 DLR托管规范在这里。该博客还包含一些示例托管应用程序

另外,关于使用-X:SaveAssemblies进行编译的先前注释之一是错误的。 -X:SaveAssemblies是作为调试功能。有一个API旨在将python代码编译成二进制文件。这篇文章解释了API以及两种模式之间的区别。

我一直在问自己同样的问题,在努力遵循这里和其他地方的建议以使IronPython和BeautifulSoup与我现有的代码很好地配合使用之后,我决定寻找替代的本机.NET解决方案。 BeautifulSoup是一段很棒的代码,起初它看起来不像.NET可用,但是后来我找到了HTML Agility Pack,如果有的话,我认为我实际上已经从BeautifulSoup获得了一些可维护性。它采用干净或者简洁的HTML,并从中生成优雅的XML DOM,可以通过XPath查询。使用几行代码,我们甚至可以取回原始XDocument,然后在LINQ to XML中编写查询。老实说,如果我们要以抓取网络为目标,那么这就是我们可能会找到的最干净的解决方案。

编辑

这是一个简单的示例(阅读:一点也不鲁棒),它解析了美国众议院的假期时间表:

using System;
using System.Collections.Generic;
using HtmlAgilityPack;

namespace GovParsingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HtmlWeb hw = new HtmlWeb();
            string url = @"http://www.house.gov/house/House_Calendar.shtml";
            HtmlDocument doc = hw.Load(url);

            HtmlNode docNode = doc.DocumentNode;
            HtmlNode div = docNode.SelectSingleNode("//div[@id='primary']");
            HtmlNodeCollection tableRows = div.SelectNodes(".//tr");

            foreach (HtmlNode row in tableRows)
            {
                HtmlNodeCollection cells = row.SelectNodes(".//td");
                HtmlNode dateNode = cells[0];
                HtmlNode eventNode = cells[1];

                while (eventNode.HasChildNodes)
                {
                    eventNode = eventNode.FirstChild;
                }

                Console.WriteLine(dateNode.InnerText);
                Console.WriteLine(eventNode.InnerText);
                Console.WriteLine();
            }

            //Console.WriteLine(div.InnerHtml);
            Console.ReadKey();
        }
    }
}

我们正在分发一个40k行的IronPython应用程序。我们还无法将整个内容编译为一个可分发的二进制文件。取而代之的是,我们将其分发为成千上万个微小的dll,每个IronPython模块一个。不过,这很好。

但是,在较新的版本IronPython 2.0上,我们有了一个新的峰值,它似乎能够将所有内容编译到一个二进制文件中。这也可以加快应用程序的启动速度(模块导入速度也更快)。希望这一高峰将在未来几天内迁移到我们的主树中。

为了进行分发,我们使用的是WiX,它是Microsoft创建msi安装的内部工具,已经开源(或者至少免费提供)。即使我们的安装有一些功能,它也没有问题。愚蠢的要求。我一定会在将来使用WiX分发其他IronPython项目。