美丽的汤能和铁蟒一起使用吗? 如果是这样的铁蟒的版本? 使用iron python在.net 2.0上分发Windows桌面应用程序是多么容易(主要是c#调用一些python代码来解析html)?
答案 0 :(得分:34)
我问自己同样的问题,在努力遵循这里和其他地方的建议,让IronPython和BeautifulSoup与我现有的代码很好地配合后,我决定去寻找替代的原生.NET解决方案。 BeautifulSoup是一个很棒的代码,起初看起来并没有像.NET那样可用的东西,但后来我找到了HTML Agility Pack,如果有的话,我认为我实际上已经获得了对BeautifulSoup的一些可维护性。它需要干净或苛刻的HTML并从中生成一个优雅的XML DOM,可以通过XPath查询。使用几行代码,您甚至可以获得原始XDocument,然后craft your queries in 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();
}
}
}
答案 1 :(得分:8)
我已经测试并使用了带有IPy 1.1和2.0的BeautifulSoup(忘了哪个测试版,但这是几个月前)。如果您仍然遇到问题,请发表评论,我会挖出我的测试代码并发布。
答案 2 :(得分:5)
如果BeautifulSoup不适用于IronPython,那是因为IronPython没有实现整个Python语言(与CPython相同)。 BeautifulSoup是纯python,没有C扩展,所以唯一的问题是IronPython与CPython在Python源代码方面的兼容性。不应该是一个,但如果有的话,错误将是显而易见的(“没有模块命名......“,”没有命名的方法......“等等。谷歌表示只有一个BS的测试失败了IronPython。它可能有效,现在可以修复该测试。我不知道。
尝试看看,这将是我的建议,除非有人有更具体的内容。
答案 3 :(得分:2)
此外,关于以前关于使用-X编译的评论之一:SaveAssemblies - 这是错误的。 -X:SaveAssemblies用作调试功能。有一个API用于将python代码编译为二进制文件。 This post解释了API以及两种模式之间的区别。
答案 4 :(得分:1)
答案 5 :(得分:1)
我们正在分发一个40k线的IronPython应用程序。我们无法将整个事物编译成单个二进制可分发的。相反,我们一直在分发它作为一个巨大的小dll,每个IronPython模块一个。这样可以正常工作。
然而,在较新版本的IronPython 2.0中,我们最近有一个峰值,它似乎能够将所有内容编译成单个二进制文件。这也导致应用程序启动速度加快(模块导入速度更快。)希望在未来几天这个峰值将迁移到我们的主树中。
要进行分发我们正在使用WiX,这是一个用于创建msi安装的Microsoft内部工具,它是开源的(至少可以免费获得)。即使我们安装了它也没有给我们带来任何问题有一些非常繁琐的要求。我一定会考虑在未来使用WiX分发其他IronPython项目。
答案 6 :(得分:1)
似乎与IronPython 2.7一起工作得很好。只需将它指向正确的文件夹即可离开:
D:\Code>ipy
IronPython 2.7 (2.7.0.40) on .NET 4.0.30319.235
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append("D:\Code\IronPython\BeautifulSoup-3.2.0")
>>> import urllib2
>>> from BeautifulSoup import BeautifulSoup
>>> page = urllib2.urlopen("http://www.example.com")
>>> soup = BeautifulSoup(page)
<string>:1: DeprecationWarning: object.__new__() takes no parameters
>>> i = soup('img')[0]
>>> i['src']
'http://example.com/blah.png'
答案 7 :(得分:0)
我没有测试过,但我会说它最有可能与最新的IPy2配合使用。
至于发行,这很简单。使用-X:SaveAssemblies选项将Python代码编译为二进制文件,然后将其与其他DLL和IPy依赖项一起发送。
答案 8 :(得分:-2)
如果你有完整的标准库和真正的re
模块(google for IronPython社区版),它可能会有效。但IronPython是一个令人难以置信的糟糕的python实现,我不会指望它。
此外,试试html5lib
。该解析器使用相同的规则解析firefox解析文档。