キレイなスープは鉄ニシキヘビに効く?もしそうなら、鉄のpythonのどのバージョンで?Iron pythonを使用して.net 2.0でWindowsデスクトップアプリを配布するのはどれくらい簡単ですか?
9 に答える
私はこれと同じ質問を自問していました。ここや他の場所のアドバイスに従って、IronPython と BeautifulSoup を既存のコードでうまく動作させるのに苦労した後、別のネイティブ .NET ソリューションを探すことにしました。BeautifulSoup は素晴らしいコードであり、最初は .NET に匹敵するものはないように見えましたが、その後HTML Agility Packを見つけました。どちらかといえば、BeautifulSoup よりも保守性が向上したと思います。きれいな HTML や雑然とした HTML から、XPath 経由でクエリできる洗練された XML DOM を生成します。数行のコードで生の XDocument を取得し、LINQ to XML でクエリを作成することもできます. 正直なところ、Web スクレイピングが目的である場合、これはおそらく最もクリーンなソリューションです。
編集
これは、米国下院の休日スケジュールを解析する単純な (読み取り: まったく堅牢ではない) 例です。
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();
}
}
}
私はBeautifulSoupをIPy1.1と2.0の両方でテストして使用しました(どちらのベータ版を忘れましたが、これは数か月前のことです)。それでも問題が解決しない場合はコメントを残してください。テストコードを掘り下げて投稿します。
BeautifulSoupがIronPythonで機能しない場合は、IronPythonがPython言語全体を実装していないためです(CPythonと同じ方法)。BeautifulSoupは純粋なPythonであり、C拡張機能がないため、唯一の問題は、Pythonソースコードに関するIronPythonとCPythonの互換性です。存在するべきではありませんが、存在する場合、エラーは明らかです(「モジュールなし」 「...」、「...という名前のメソッドはありません」など)。Googleによると、IronPythonで失敗するのはBSのテストの1つだけです。それはおそらく機能し、そのテストは今では修正されるかもしれません。わかりません。
誰かがもっと具体的なものを持っていない限り、それを試してみて、私のアドバイスになるでしょう。
また、-X:SaveAssemblies を使用したコンパイルに関する以前のコメントの 1 つに関して、それは間違っています。-X:SaveAssemblies は、デバッグ機能として意図されています。Python コードをバイナリにコンパイルするための API があります。この投稿では、API と 2 つのモードの違いについて説明します。
IronPython2.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'
40k 行の IronPython アプリケーションを配布しています。すべてを 1 つのバイナリ配布可能ファイルにコンパイルすることはできませんでした。代わりに、IronPython モジュールごとに 1 つずつ、無数の小さな dll として配布してきました。これはうまくいきます。
ただし、新しいリリースである IronPython 2.0 では、すべてを 1 つのバイナリ ファイルにコンパイルできるように見える最近のスパイクがあります。これにより、アプリケーションの起動も高速化されます (モジュールのインポートが高速化されます)。願わくば、このスパイクが今後数日でメイン ツリーに移行することを願っています。
配布を行うために、WiX を使用しています。WiX は、msi インストールを作成するための Microsoft 内部ツールであり、オープンソース化されています (または、少なくとも自由に利用できるようになっています)。厄介な要件。今後、WiX を使用して他の IronPython プロジェクトを配布することを検討します。
テストはしていませんが、最新の IPy2 で動作する可能性が高いと思います。
配布に関しては、非常に簡単です。-X:SaveAssemblies オプションを使用して、Python コードをバイナリにコンパイルし、それを他の DLL および IPy 依存関係と共に出荷します。
完全な標準ライブラリと実際のre
モジュール (Google for IronPython community edition) があれば、うまくいくかもしれません。しかし、IronPython は信じられないほど悪い python 実装です。
さらに、html5lib
試してみてください。そのパーサーは、Firefox がドキュメントを解析するのと同じルールで解析します。