Pregunta

Qué hermosa sopa de trabajo con el hierro de python?Si es así con que versión de hierro python?¿Es fácil de distribuir aplicaciones de escritorio de windows en .net 2.0 el uso de hierro python (sobre todo c# a llamar a algunos de código python para el análisis de html)?

¿Fue útil?

Solución

Me hacía esta misma pregunta y después de luchar para seguir consejos de aquí y de otros lugares para obtener IronPython y BeautifulSoup a jugar muy bien con mi código existente decidí ir en busca de una alternativa nativa .NETO de la solución.BeautifulSoup es una maravillosa poco de código y al principio parecía que no había nada comparable disponible para .NET, pero luego me encontré con el HTML Agilidad Pack y si algo creo que he ganado algo de mantenimiento a través de BeautifulSoup.Se necesita limpiar o crufty HTML y produce un elegante DOM de XML que puede ser consultado a través de XPath.Con un par de líneas de código se puede incluso obtener un crudo XDocument y, a continuación, la creación de consultas de LINQ to XML.Sinceramente, si de web scraping es su objetivo, esto es acerca de la solución más limpia, es probable que encontrar.

Editar

Aquí es un simple (leer:no robusto en todos) ejemplo que analiza la cámara de Representantes calendario de vacaciones:

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

Otros consejos

He probado y utilizado BeautifulSoup con tanto IPy 1.1 y 2.0 (olvidar que la beta, pero esto fue hace un par de meses).Deja un comentario si usted todavía está teniendo problemas y voy a cavar mi código de prueba y post-it.

Si BeautifulSoup no funciona en IronPython, es porque IronPython no aplicar la totalidad de Python (lenguaje de la misma manera CPython hace).BeautifulSoup es puro python, no C-extensiones, por lo que el único problema es la compatibilidad de IronPython con CPython en términos de código fuente de Python.No debería haber uno, pero si no hay, el error será obvio ("no módulo llamado ...", "no existe un método llamado ...", etc.).Google dice que sólo uno de los BS de las pruebas falla con IronPython.probablemente trabaja, y que la prueba puede ser solucionado por ahora.Yo no lo sé.

Probar y ver, sería mi consejo, a menos que alguien tenga algo más concreto.

También, con respecto a uno de los comentarios anteriores acerca de la compilación de con -X:SaveAssemblies - que está mal.-X:SaveAssemblies se entiende como una característica de depuración.Hay una API que significaba para la compilación de código python en archivos binarios. Este post explica la API y la diferencia entre los dos modos.

Respecto a la segunda parte de su pregunta, usted puede utilizar el DLR Api de Hospedaje para ejecutar IronPython código desde dentro de una aplicación en C#.El DLR hosting especificación es aquí.Este blog también contiene algunos ejemplos de hosting de aplicaciones

Estamos distribuyendo un 40k línea IronPython aplicación.No hemos sido capaces de compilar todo en un solo binario distribuible.Por el contrario, hemos estado distribuyendo como un millón de millones de diminutas dll, uno para cada IronPython módulo.Esto funciona bien.

Sin embargo, en la versión más reciente, IronPython 2.0, tenemos una reciente alza que parece ser capaz de compilar todo en un único archivo binario.Esto también se traduce en el más rápido de inicio de la aplicación demasiado (módulo de importación es más rápido.) Esperemos que este aumento va a migrar en nuestro árbol principal en los próximos días.

Para hacer la distribución que estamos usando WiX, que es una herramienta interna de Microsoft para la creación de msi instala, que ha sido de código abierto (o de libre disposición, al menos.) Se nos ha dado ningún problema, aunque nuestro instalar tiene algunos bastante complicados requisitos.Definitivamente voy a mirar en el uso de WiX para distribuir otros IronPython proyectos en el futuro.

Parece que funciona muy bien con IronPython 2.7.Sólo necesitas que apunte a la carpeta de la derecha y listo:

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'

Yo no lo he probado, pero yo diría que lo más probable es trabajar con la última IPy2.

Como para la distribución, es muy simple.Usa la opción-X:SaveAssemblies opción para compilar el código de Python abajo a binario y luego enviarlo con sus otros archivos Dll y el IPy dependencias.

Si usted tiene la completa biblioteca estándar y el real re (módulo de google para IronPython community edition) podría funcionar.Pero IronPython es una increíble mala implementación de python, no cuento con eso.

Además, dar html5lib un intento.Que el analizador analiza con las mismas reglas de firefox analiza los documentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top