Железный python, красивый суп, приложение для win32
-
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 и разницу между двумя режимами.
Мы распространяем приложение 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 выполняет синтаксический анализ документов.