Question

Est-ce que la belle soupe fonctionne avec du python de fer? Si oui avec quelle version de Iron Python? Est-il facile de distribuer une application de bureau Windows sur .net 2.0 à l’aide de Iron Python (principalement c # appelant du code python pour l’analyse HTML)?

Était-ce utile?

La solution

Je me posais la même question et après avoir eu du mal à suivre les conseils donnés ici et ailleurs pour que IronPython et BeautifulSoup jouent correctement avec mon code existant, j'ai décidé de rechercher une solution alternative .NET native. BeautifulSoup est un merveilleux morceau de code. Au début, rien ne semblait comparable à .NET, mais j’ai trouvé le HTML Agility Pack et, si je ne me trompe pas, j’ai vraiment acquis une certaine facilité de maintenance grâce à BeautifulSoup. Il utilise un langage HTML propre ou cruel et en génère un élégant DOM XML pouvant être interrogé via XPath. Avec quelques lignes de code, vous pouvez même récupérer un XDocument brut, puis construisez vos requêtes dans LINQ to XML . Honnêtement, si votre objectif est de vous gratter la toile, c’est la solution la plus propre que vous puissiez trouver.

Modifier

Voici un exemple simple (lire: pas du tout robuste) qui analyse le calendrier des jours fériés à la Chambre des représentants:

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

Autres conseils

J'ai testé et utilisé BeautifulSoup avec IPy 1.1 et 2.0 (oubliez quelle version bêta, mais c'était il y a quelques mois). Laissez un commentaire si vous rencontrez toujours des problèmes et je vais extraire mon code de test et le poster.

Si BeautifulSoup ne fonctionne pas sur IronPython, c’est parce qu’IronPython n’implémente pas tout le langage Python (de la même manière que CPython). BeautifulSoup est du pur-python, pas d’extensions C, le seul problème est donc la compatibilité d’IronPython avec CPython en termes de code source Python. Il ne devrait pas en exister, module nommé ... "," aucune méthode nommée ... ", etc.). Google affirme qu'un seul des tests de BS échoue avec IronPython. cela fonctionne probablement, et ce test peut être corrigé maintenant. Je ne saurais pas.

Essayez-le et voyez, ce serait mon conseil, à moins que quelqu'un n'ait quelque chose de plus concret.

De plus, en ce qui concerne l’un des commentaires précédents sur la compilation avec -X: SaveAssemblies, c’est faux. -X: SaveAssemblies est conçu comme une fonctionnalité de débogage. Il existe une API destinée à la compilation de code python en fichiers binaires. Ce message explique l’API et la différence entre les deux modes.

En ce qui concerne la deuxième partie de votre question, vous pouvez utiliser les API d’hébergement DLR pour exécuter le code IronPython à partir d’une application C #. La spécification d'hébergement DLR est ici . Ce blog contient également des exemples d'applications d'hébergement

.

Nous distribuons une application IronPython de 40 000 lignes. Nous n'avons pas pu compiler le tout dans un seul fichier binaire distribuable. Au lieu de cela, nous l’avons distribué sous forme de zillions petites DLL, une pour chaque module IronPython. Cela fonctionne bien cependant.

Cependant, sur la version plus récente, IronPython 2.0, nous avons un pic récent qui semble pouvoir tout compiler dans un seul fichier binaire. Cela permet également un démarrage plus rapide des applications (l'importation de modules est plus rapide). Espérons que cette pointe va migrer dans notre arborescence principale dans les prochains jours.

Pour la distribution, nous utilisons WiX, un outil interne de Microsoft permettant de créer des installations msi, qui a été open source (ou mis à disposition gratuitement, du moins.) Cela ne nous a posé aucun problème, même si notre installation a des exigences assez délicates. Je vais certainement utiliser WiX pour distribuer d’autres projets IronPython à l’avenir.

semble fonctionner parfaitement avec IronPython 2.7. Il vous suffit de pointer le fichier vers le bon dossier et de partir:

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'

Je ne l'ai pas testé, mais je dirais qu'il fonctionnera probablement avec le dernier IPy2.

En ce qui concerne la distribution, c'est très simple. Utilisez l'option -X: SaveAssemblies pour compiler votre code Python en binaire, puis envoyez-le avec vos autres DLL et les dépendances IPy.

Si vous avez la bibliothèque standard complète et le vrai module re (Google pour l'édition de communauté IronPython), cela pourrait fonctionner. Mais IronPython est une mauvaise implémentation en python, je ne compterais pas sur ça.

Par ailleurs, essayez html5lib . Cet analyseur analyse avec les mêmes règles que Firefox analyse les documents.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top