2008-09-23 11 views
21

Funktioniert schöne Suppe mit Eisen Python? Wenn ja mit welcher Version von Eisenpython? Wie einfach ist es, eine Windows-Desktop-App auf .net 2.0 mit Iron Python zu verteilen (meist C# aufrufen einige Python-Code zum Parsen von HTML)?Eisen Python, schöne Suppe, Win32 App

Antwort

34

Ich habe mir die gleiche Frage gestellt und nachdem ich versucht habe, Ratschläge hier und anderswo zu befolgen, um IronPython und BeautifulSoup zum Spielen mit meinem bestehenden Code zu bekommen, entschied ich mich für eine alternative native .NET Lösung zu suchen. BeautifulSoup ist ein wunderbares Stück Code und anfangs sah es nicht so aus, als ob es für .NET etwas Vergleichbares gäbe, aber dann fand ich die HTML Agility Pack und wenn überhaupt, denke ich, dass ich tatsächlich eine gewisse Wartbarkeit über BeautifulSoup erlangt habe. Es nimmt sauberes oder knauseriges HTML und erzeugt daraus ein elegantes XML-DOM, das über XPath abgefragt werden kann. Mit ein paar Zeilen Code können Sie sogar ein rohes XDocument und dann craft your queries in LINQ to XML zurückbekommen. Ehrlich gesagt, wenn Web Scraping Ihr Ziel ist, ist dies die sauberste Lösung, die Sie wahrscheinlich finden werden.

bearbeiten

Hier ist ein einfaches (sprich: nicht robust überhaupt) Beispiel, das die US-Repräsentantenhaus Urlaub planen parst aus:

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(); 
     } 
    } 
} 
+0

HAP ist eine gute Lösung, ich habe eine Reihe von Apps in der Produktion, die es verwenden. Ich habe Mozilla Html Parser verwendet und es gibt keinen großen Unterschied. –

0

Ich habe es nicht getestet, aber ich würde sagen, dass es höchstwahrscheinlich mit der neuesten IPy2 funktionieren wird.

Wie für die Verteilung ist es sehr einfach. Verwenden Sie die Option -X: SaveAssemblies, um Ihren Python-Code in eine Binärdatei zu kompilieren und dann zusammen mit Ihren anderen DLLs und den IPy-Abhängigkeiten zu senden.

5

Wenn BeautifulSoup nicht auf IronPython funktioniert, ist dies, weil IronPython nicht die gesamte Python-Sprache implementiert (auf die gleiche Weise wie CPython). BeautifulSoup ist pure-python, keine C-Erweiterungen, also ist das einzige Problem die Kompatibilität von IronPython mit CPython in Bezug auf Python-Quellcode. Es sollte keinen geben, aber wenn ja, ist der Fehler offensichtlich ("kein Modul named ... "," keine Methode namens ... ", etc.). Google sagt, dass nur einer der Tests von BS mit IronPython versagt. es funktioniert wahrscheinlich, und dieser Test kann inzwischen behoben sein. Ich würde es nicht wissen.

Probieren Sie es aus und sehen, wäre mein Rat, es sei denn, jemand hat etwas konkreter.

8

Ich habe BeautifulSoup sowohl mit IPy 1.1 als auch mit 2.0 getestet und getestet (vergiss welche Beta, aber das war ein paar Monate zurück). Hinterlasse einen Kommentar, wenn du immer noch Probleme hast und ich werde meinen Testcode ausgraben und posten.

-2

Wenn Sie die vollständige Standardbibliothek und das echte re Modul (google für IronPython Community Edition) haben, könnte es funktionieren. Aber IronPython ist eine unglaublich schlechte Python-Implementierung, darauf würde ich nicht zählen.

Geben Sie außerdem html5lib einen Versuch. Dieser Parser analysiert dieselben Regeln wie Firefox Dokumente analysiert.

+0

ich Ironpython nicht, aber was ich bisher gelesen habe darüber die „unglaublich schlecht Python-Implementierung“ nicht bescheinigen [Tippfehler beseitigt ]. – tzot

+0

Ich halte IronPython nicht für unglaublich schlecht. Es macht auf viele Sachen gut. Erwarten Sie nicht, dass es ein Ersatz für CPython ist. –

1

Im zweiten Teil Ihrer Frage können Sie die DLR-Hosting-APIs verwenden, um IronPython-Code innerhalb einer C# -Anwendung auszuführen. Die DLR-Hosting-Spezifikation lautet here. Diese enthält auch einige Beispiel-Hosting-Anwendungen

2

Auch in Bezug auf eine der vorherigen Kommentare zum Kompilieren mit -X: SaveAssemblies - das ist falsch. -X: SaveAssemblies ist als Debugging-Funktion gedacht. Es gibt eine API zum Kompilieren von Python-Code in Binärdateien. This post erklärt die API und den Unterschied zwischen den beiden Modi.

1

Wir vertreiben eine 40k Leitung Ironpython-Anwendung . Wir waren nicht in der Lage, das Ganze zu einem einzigen binären Distributiv zu kompilieren. Stattdessen haben wir es als eine Zillion winziger dlls verteilt, eine für jedes IronPython-Modul. Das funktioniert aber gut.

Allerdings, auf der neueren Version, IronPython 2.0, haben wir eine aktuelle Spitze, die in der Lage scheint, alles in eine einzige Binärdatei zu kompilieren. Dies führt auch zu einem schnelleren Start der Anwendung (Modulimport ist schneller). Hoffentlich wird dieser Spike in den nächsten Tagen in unseren Hauptbaum wandern.

Für die Verteilung verwenden wir WiX, das ist ein internes Microsoft-Tool zum Erstellen von MSI-Installationen, die Open-Source (oder frei verfügbar, zumindest.) Es hat uns keine Probleme gegeben, obwohl unsere Installation hat einige ziemlich knifflige Anforderungen. Ich werde definitiv mit WiX schauen, um andere IronPython-Projekte in Zukunft zu verteilen.

1

Scheint mit IronPython 2.7 gut zu funktionieren. Nur müssen sie im richtigen Ordner zeigen und gehen Sie weg:

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'