Domanda

La bella zuppa funziona con il pitone di ferro? In tal caso con quale versione di Iron Python? Quanto è facile distribuire un'app desktop di Windows su .net 2.0 usando iron python (principalmente c # chiamando un codice python per analizzare html)?

È stato utile?

Soluzione

Mi stavo ponendo questa stessa domanda e dopo aver faticato a seguire i consigli qui e altrove per far funzionare IronPython e BeautifulSoup con il mio codice esistente, ho deciso di cercare una soluzione .NET nativa alternativa. BeautifulSoup è un meraviglioso codice e all'inizio non sembrava che ci fosse qualcosa di paragonabile disponibile per .NET, ma poi ho trovato HTML Agility Pack e semmai penso di aver effettivamente guadagnato una certa manutenibilità su BeautifulSoup. Prende HTML pulito o crufty e da esso produce un elegante DOM XML che può essere interrogato tramite XPath. Con un paio di righe di codice puoi persino recuperare un XDocument non elaborato e quindi crea le tue query in LINQ to XML . Onestamente, se il web scraping è il tuo obiettivo, si tratta della soluzione più pulita che potresti trovare.

Modifica

Ecco un semplice esempio (leggi: per nulla solido) che analizza il programma delle festività della Camera dei rappresentanti degli Stati Uniti:

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

Altri suggerimenti

Ho testato e usato BeautifulSoup sia con IPy 1.1 che con 2.0 (dimentica quale beta, ma era qualche mese fa). Lascia un commento se hai ancora problemi e io estrarrò il mio codice di prova e lo pubblicherò.

Se BeautifulSoup non funziona su IronPython, è perché IronPython non implementa l'intero linguaggio Python (allo stesso modo in cui CPython funziona). BeautifulSoup è pure-python, senza estensioni C, quindi l'unico problema è la compatibilità di IronPython con CPython in termini di codice sorgente Python. Non dovrebbe essercene uno, ma se c'è, l'errore sarà evidente (" no modulo chiamato ... " ;, " nessun metodo chiamato ... " ;, ecc.). Google afferma che solo uno dei test di BS ha esito negativo con IronPython. probabilmente funziona e quel test potrebbe essere risolto ormai. Non lo saprei.

Provalo e vedi, sarebbe il mio consiglio, a meno che qualcuno non abbia qualcosa di più concreto.

Inoltre, per quanto riguarda uno dei precedenti commenti sulla compilazione con -X: SaveAssemblies - è sbagliato. -X: SaveAssemblies è inteso come una funzione di debug. Esiste un'API destinata alla compilazione del codice Python in file binari. Questo post spiega l'API e la differenza tra le due modalità.

Per quanto riguarda la seconda parte della domanda, è possibile utilizzare le API di hosting DLR per eseguire il codice IronPython da un'applicazione C #. Le specifiche di hosting DLR sono qui . Questo blog contiene anche alcune applicazioni di hosting di esempio

Stiamo distribuendo un'applicazione IronPython a 40k line. Non siamo stati in grado di compilare il tutto in un unico binario distribuibile. Invece lo abbiamo distribuito come un milione di minuscole dll, una per ciascun modulo IronPython. Funziona bene però.

Tuttavia, nella versione più recente, IronPython 2.0, abbiamo un picco recente che sembra essere in grado di compilare tutto in un singolo file binario. Ciò si traduce anche in un avvio più rapido dell'applicazione (l'importazione dei moduli è più veloce.) Speriamo che questo picco migrerà nel nostro albero principale nei prossimi giorni.

Per fare la distribuzione stiamo usando WiX, che è uno strumento interno di Microsoft per la creazione di installazioni msi, che è stato di provenienza aperta (o reso liberamente disponibile, almeno.) Non ci ha dato problemi, anche se la nostra installazione ha alcuni requisiti piuttosto difficili. In futuro esaminerò sicuramente l'utilizzo di WiX per distribuire altri progetti IronPython.

Sembra funzionare bene con IronPython 2.7. Devo solo indicarlo nella cartella giusta e vai via:

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'

Non l'ho provato, ma direi che molto probabilmente funzionerà con l'ultimo IPy2.

Per quanto riguarda la distribuzione, è molto semplice. Utilizzare l'opzione -X: SaveAssemblies per compilare il codice Python in un file binario e quindi inviarlo con le altre DLL e le dipendenze IPy.

Se hai la libreria standard completa e il vero modulo re (google for IronPython community edition) potrebbe funzionare. Ma IronPython è un'incredibile implementazione di un python male, non ci contare.

Inoltre, prova html5lib . Quel parser analizza con le stesse regole firefox analizza i documenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top