Pergunta

O belo trabalho sopa com python ferro? Se assim com a versão do python de ferro? Como é fácil para distribuir um aplicativo do Windows desktop no .NET 2.0 usando python ferro (principalmente c # chamar algum código python para analisar html)?

Foi útil?

Solução

Eu estava me perguntando a mesma pergunta e depois de lutar para seguir o conselho aqui e em outros lugares para obter IronPython e BeautifulSoup para jogar bem com o meu código existente eu decidi ir à procura de uma solução alternativa .NET nativa. BeautifulSoup é um pouco maravilhosa de código e, a princípio, não parecia que havia qualquer coisa comparável disponível para .NET, mas depois eu encontrei o Agility pacote HTML e se qualquer coisa que eu acho que eu realmente ganhou alguma manutenção ao longo BeautifulSoup. É preciso limpar ou intrincada HTML e produz um DOM XML elegante a partir dele que pode ser consultado via XPath. Com algumas linhas de código que você pode até mesmo voltar a XDocument cru e, em seguida, criar suas consultas em LINQ para XML. Honestamente, se web scraping é o seu objetivo, isto é sobre a solução mais limpa que são susceptíveis de encontrar.

Editar

Aqui é um simples (leia-se: não robusta em tudo) exemplo que analisa a programação de férias US Câmara dos Deputados:

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

Outras dicas

Eu tenho testado e utilizado BeautifulSoup tanto com IPy 1.1 e 2.0 (esqueça que beta, mas isso foi há alguns meses). Deixe um comentário se você ainda está tendo problemas e eu vou cavar meu código de teste e postá-lo.

Se BeautifulSoup não funciona em IronPython, é porque IronPython não implementa toda a linguagem Python (da mesma forma CPython faz). BeautifulSoup é puro-python, há C-extensões, de modo que o único problema é a compatibilidade de IronPython com CPython em termos de Python fonte code.There não deve ser um, mas se houver, o erro será óbvio ( "nenhum módulo chamado ... ", "nenhum método chamado ...", etc.). Google diz que apenas um dos testes da BS falha com IronPython. provavelmente funciona, e que o teste pode ser fixado por agora. Eu não saberia.

Experimente e veja, seria o meu conselho, a menos que alguém tem algo mais concreto.

Além disso, em relação a um dos comentários anteriores sobre compilando com -X: SaveAssemblies - isto é errado. -X: SaveAssemblies se entende como um recurso de depuração. Há uma API significou para compilar o código python em binários. Este post explica a API ea diferença entre os dois modos.

Em relação à segunda parte da sua pergunta, você pode usar a DLR hospedagem APIs para executar código IronPython dentro de um aplicativo C #. O DLR hospedagem especificação é aqui . Este blogue também contém alguns exemplos de aplicações hospedagem

Estamos distribuindo um 40k linha de aplicação IronPython. Nós não ter sido capaz de compilar a coisa toda em um único distribuível binário. Em vez disso, foram distribuí-lo como um zilhão de pequenos dlls, um para cada módulo IronPython. Esta multa que funciona.

No entanto, na mais recente lançamento, IronPython 2.0, temos um pico recente, que parece ser capaz de compilar tudo em um único arquivo binário. Isso também resulta em aplicativo mais rápido start-up também (módulo de importação é mais rápido.) Esperemos que este aumento irá migrar para a nossa árvore principal nos próximos dias.

Para fazer a distribuição estamos usando WiX, que é uma ferramenta interna da Microsoft para criar msi instala, que tem sido open-source (ou disponibilizados gratuitamente, pelo menos.) Ele nos deu nenhum problema, embora a nossa instalar tem alguns requisitos bastante complicados. Definitivamente vou olhar usando WiX para distribuir outros projectos IronPython no futuro.

Parece funcionar muito bem com IronPython 2.7. Apenas precisa de apontá-lo para a pasta direita e você vai longe:

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'

Eu não testei, mas eu diria que ele vai trabalhar mais provável com a mais recente IPy2.

Quanto à distribuição, é muito simples. Use o -X:. Opção SaveAssemblies para compilar seu código Python para baixo para um binário e, em seguida, enviá-lo com suas outras DLLs e as dependências do API

Se você tiver a biblioteca padrão completa e o módulo verdadeira re (google para IronPython edição da comunidade) que pode funcionar. Mas IronPython é uma implementação ruim python incrível, eu não contaria com isso.

Além disso, dar html5lib uma tentativa. Que analisa analisador com as mesmas regras firefox analisa documentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top