Работает ли прекрасный суп с железным питоном? Если да, то с какой версией железного питона? Насколько легко распространять настольное приложение Windows на .net 2.0 с использованием железа python (в основном С#, вызывающего некоторый код python для разбора html)?
Железный питон, красивый суп, приложение win32
Ответ 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, анализирует документы.