Frage

Ist schöne Suppe Arbeit mit Eisen Python? Wenn ja, mit welcher Version von Eisen Python? Wie einfach ist es eine Windows-Desktop-Anwendung auf .net 2.0 unter Verwendung von Eisen Python zu verteilen (meist Aufruf c # einigen Python-Code html für das Parsen)?

War es hilfreich?

Lösung

ich mir dieselbe Frage stelle und nach hier Rat folgen kämpfen und anderswo Ironpython und BeautifulSoup zu bekommen schön mit meinem vorhandenen Code zu spielen, ich für eine alternative nativen .NET-Lösung suchen gehen entschieden. BeautifulSoup ist ein wunderbares Stück Code und zunächst gar nicht schauen, wie es etwas für .NET vergleichbar verfügbar war, aber dann fand ich die HTML Agility Pack- und wenn alles, was ich glaube, ich habe tatsächlich einige Wartbarkeit über BeautifulSoup gewonnen. Es dauert sauber oder crufty HTML und erzeugt einen eleganten XML DOM von ihm, die über XPath abgefragt werden können. Mit ein paar Zeilen Code können Sie sogar ein rohes XDocument zurück und dann Handwerk Ihre Abfragen in LINQ to XML . Ehrlich gesagt, wenn Web-Scraping Ihr Ziel ist es, hier geht es um die sauberste Lösung, die Sie wahrscheinlich zu finden sind.

Bearbeiten

Hier ist ein einfaches (sprich: nicht robust überhaupt) Beispiel, das das 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();
        }
    }
}

Andere Tipps

Ich habe getestet und verwendet BeautifulSoup sowohl mit IPy 1.1 und 2.0 (vergessen die Beta, aber das war ein paar Monate zurück). Hinterlassen Sie einen Kommentar, wenn Sie immer noch Probleme haben und ich werde meinen Testcode ausgraben und per Post.

Wenn BeautifulSoup nicht auf Ironpython funktioniert, dann ist es, weil Ironpython implementieren nicht die ganze Sprache Python (die gleiche Art und Weise CPython tut). BeautifulSoup ist pure-Python, keine C-Erweiterungen, so das einzige Problem der Kompatibilität von Ironpython mit CPython in Bezug auf die Python Quelle ist code.There sollte nicht sein, aber wenn es ist, wird der Fehler offensichtlich sein ( "kein Modul genannt ... ", "genannt keine Methode ...", etc.). Google sagt, dass nur ein Test von BS mit Ironpython ausfällt. es funktioniert wahrscheinlich, und das Test von nun behoben werden kann. Ich möchte nicht wissen.

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

Auch in Bezug auf eine der vorherigen Kommentare über das Kompilieren mit -X: SaveAssemblies - das ist falsch. -X: SaveAssemblies als Debug-Funktion gemeint. Es gibt eine API für die Erstellung von Python-Code in Binär-Dateien gedacht. Dieser Beitrag erklärt die API und den Unterschied zwischen den beiden Modi.

In Bezug auf den zweiten Teil Ihrer Frage, können Sie die DLR-Hosting-APIs verwenden, Ironpython-Code aus einer C # Anwendung auszuführen. Der DLR-Hosting-spec ist hier . Dieses Blog auch einige Beispiel Hosting-Anwendungen enthält

Wir verteilen eine 40k Leitung Ironpython-Anwendung. Wir haben nicht in der Lage gewesen, das Ganze in eine einzige binäre verteilbar zu kompilieren. Stattdessen haben wir es als eine Unmenge winziger dlls worden Verteilung, eine für jedes Modul Ironpython. Dies funktioniert jedoch in Ordnung.

Doch auf der neueren Release, Ironpython 2.0, haben wir eine neue Spitze, die alles in eine einzige Binärdatei zu können, scheint kompilieren. Dies führt auch zu einem schnelleren Anwendung Start-up zu (Modul Import ist schneller.) Hoffentlich ist dieser Dorn in unseren Baum in den nächsten Tagen wandern.

, um die Verteilung tun wir WiX verwenden, die ein Microsoft internes Tool ist msi für die Erstellung installiert, die Open-Source wurde (oder frei verfügbar, zumindest gemacht.) Es hat uns keine Probleme, auch wenn unsere installieren hat einige ziemlich knifflig Anforderungen. Ich werde auf jeden Fall sehen WiX mit anderem Ironpython Projekte in der Zukunft zu verteilen.

Es scheint ganz gut mit Ironpython 2.7 zu arbeiten. 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'

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

Wie für den Vertrieb, ist es sehr einfach. Verwenden Sie die -X:. SaveAssemblies Option Ihren Python-Code zu kompilieren nach unten in einem binären und dann versenden Sie es mit Ihrem anderen DLLs und den IPy Abhängigkeiten

Wenn Sie die komplette Standardbibliothek und der realen re Modul haben (google für Ironpython Community Edition) es könnte funktionieren. Aber Ironpython ist eine unglaubliche schlechte Python-Implementierung, würde ich nicht darauf verlassen.

Außerdem geben html5lib versuchen. Das Parser analysiert mit den gleichen Regeln firefox analysiert Dokumente.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top