铁蟒蛇,美丽的汤,win32应用程序
美丽的汤可以和铁蟒蛇一起工作吗?
如果是的话,哪个版本的铁蟒蛇?
使用铁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项目。