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

StackOverflow https://stackoverflow.com/questions/118654

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Я задавал себе этот же вопрос, и после попыток следовать советам здесь и в других местах, чтобы заставить IronPython и BeautifulSoup хорошо работать с моим существующим кодом, я решил поискать альтернативное нативное решение .NET.BeautifulSoup - замечательный фрагмент кода, и сначала казалось, что для .NET нет ничего сопоставимого, но потом я нашел HTML-пакет Гибкости и если уж на то пошло, я думаю, что я действительно получил некоторую ремонтопригодность по сравнению с 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();
        }
    }
}

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top