Подтвердить что ты не робот

Железный питон, красивый суп, приложение win32

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

4b9b3361

Ответ 1

Я задавал себе этот же вопрос, и после того, как я попытался следовать советам здесь и в других местах, чтобы заставить 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();
        }
    }
}

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Кажется, все отлично работает с 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'

Ответ 8

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

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

Ответ 9

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

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