Железный питон, красивый суп, приложение win32 - PullRequest
21 голосов
/ 23 сентября 2008

Прекрасный суп работает с железным питоном? Если да, то с какой версией железного питона? Насколько легко распространять приложение Windows для настольных компьютеров на .net 2.0, используя железный питон (в основном c #, вызывающий некоторый код на Python для разбора HTML)?

Ответы [ 9 ]

34 голосов
/ 04 октября 2008

Я задавал себе этот же вопрос и, пытаясь следовать советам здесь и в других местах, чтобы IronPython и BeautifulSoup хорошо играли с моим существующим кодом, я решил поискать альтернативное нативное решение .NET. BeautifulSoup - замечательный фрагмент кода, и поначалу он не выглядел так, как будто бы было доступно что-то сопоставимое для .NET, но потом я обнаружил HTML Agility Pack , и если что-то, на мой взгляд, я действительно получил немного ремонтопригодность по сравнению с BeautifulSoup. Он берет чистый или грубый HTML и создает из него элегантный XML DOM, который можно запрашивать через XPath. С помощью пары строк кода вы даже можете получить сырой XDocument, а затем обработать ваши запросы в LINQ to XML . Честно говоря, если ваша цель - очистка веб-страниц, это самое чистое решение, которое вы, вероятно, найдете.

Редактировать

Вот простой (читай: совсем не надежный) пример, который анализирует график праздников Палаты представителей США:

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();
        }
    }
}
8 голосов
/ 23 сентября 2008

Я тестировал и использовал BeautifulSoup с IPy 1.1 и 2.0 (забудьте, какая бета, но это было несколько месяцев назад). Оставьте комментарий, если у вас все еще проблемы, и я выкопаю свой тестовый код и опубликую его.

5 голосов
/ 23 сентября 2008

Если BeautifulSoup не работает на IronPython, это потому, что IronPython не реализует весь язык Python (так же, как CPython). BeautifulSoup - это чистый Python, без C-расширений, поэтому единственная проблема - это совместимость IronPython с CPython с точки зрения исходного кода Python. Не должно быть ни одного, но если он есть, ошибка будет очевидна («нет модуля named ... "," метод named ... "и т. д.). Google говорит, что только один из тестов BS провалился с IronPython. это, вероятно, работает, и этот тест может быть исправлен к настоящему времени. Я бы не знал.

Попробуйте и посмотрите, был бы мой совет, если у кого-то нет ничего более конкретного.

2 голосов
/ 24 сентября 2008

Также, относительно одного из предыдущих комментариев о компиляции с -X: SaveAssemblies - это неправильно. -X: SaveAssemblies подразумевает функцию отладки. Существует API, предназначенный для компиляции кода Python в двоичные файлы. Этот пост объясняет API и разницу между двумя режимами.

1 голос
/ 01 июля 2011

Кажется, отлично работает с IronPython 2.7. Просто нужно указать его на нужную папку и все готово:

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'
1 голос
/ 13 ноября 2008

Мы распространяем приложение IronPython по 40 тыс. Строк. Мы не смогли собрать все это в один двоичный дистрибутив. Вместо этого мы распространяли его как миллионы крошечных библиотек, по одному на каждый модуль IronPython. Это работает хорошо, хотя.

Однако в более новой версии IronPython 2.0 у нас появился недавний всплеск, который, похоже, способен скомпилировать все в один двоичный файл. Это также приводит к более быстрому запуску приложения (импорт модуля происходит быстрее.) Надеемся, что этот всплеск перенесется в наше главное дерево в ближайшие несколько дней.

Для распространения мы используем WiX, который является внутренним инструментом Microsoft для создания MSI-установок, который был с открытым исходным кодом (или, по крайней мере, сделан доступным бесплатно). Он не доставил нам никаких проблем, хотя наша установка имеет некоторые довольно сложные требования. Я обязательно расскажу об использовании WiX для распространения других проектов IronPython в будущем.

1 голос
/ 24 сентября 2008

Что касается второй части вашего вопроса, вы можете использовать API хостинга DLR для запуска кода IronPython из приложения C #. Спецификация хостинга DLR здесь . Этот блог также содержит некоторые примеры хостинговых приложений

0 голосов
/ 23 сентября 2008

Если у вас есть полная стандартная библиотека и настоящий модуль re (версия для сообщества Google для IronPython), он может работать. Но IronPython - невероятно плохая реализация на python, я бы на это не рассчитывал.

Кроме того, попробуйте html5lib. Этот синтаксический анализатор анализирует по тем же правилам, что Firefox анализирует документы.

0 голосов
/ 23 сентября 2008

Я не проверял это, но я бы сказал, что он, скорее всего, будет работать с последней IPy2.

Что касается рассылки, все очень просто. Используйте опцию -X: SaveAssemblies, чтобы скомпилировать ваш код Python в двоичный файл, а затем отправить его вместе с другими вашими DLL и зависимостями IPy.

...