2008-09-23 2 views
21

철분 파이톤으로 아름다운 수프가 작동합니까? 그렇다면 철 파이썬의 버전은 무엇입니까? 철분 파이썬 (주로 C#에서 HTML을 파싱하기위한 일부 파이썬 코드 호출)을 사용하여 .net 2.0에 Windows 데스크톱 응용 프로그램을 배포하는 것이 얼마나 쉬운가요?철 파이썬, 아름다운 스프, win32 앱

답변

34

나는이 동일한 질문을하고 여기 IronPython 및 BeautifulSoup을 기존 코드로 멋지게 플레이하기 위해 여기 또는 다른 곳에서 조언을 따르기 위해 고심하고 나섰다. 나는 대체 네이티브 .NET 솔루션을 찾기로 결심했다. BeautifulSoup는 멋진 코드이며 처음에는. NET에서 사용할 수있는 것과 비슷한 것이 없었지만, HTML Agility Pack을 찾았습니다. 실제로 BeautifulSoup에 대한 유지 관리 능력을 실제로 얻었습니다. 그것은 깨끗한 HTML을 필요로하며 XPath를 통해 질의 할 수있는 우아한 XML DOM을 생성합니다. 몇 줄의 코드를 사용하면 원시 XDocument를 다시 가져올 수 있으며 craft your queries in 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(); 
     } 
    } 
} 
+0

HAP는 좋은 솔루션입니다. 프로덕션에서 사용하는 앱이 많이 있습니다. 필자는 Mozilla Html Parser를 사용했으며 많은 차이점이 없습니다. –

0

테스트하지는 않았지만 최신 IPy2에서 작동 할 가능성이 가장 높습니다.

배포는 매우 간단합니다. -X : SaveAssemblies 옵션을 사용하여 Python 코드를 바이너리로 컴파일 한 다음 다른 DLL 및 IPy 종속성과 함께 제공하십시오.

5

IronPython에서 BeautifulSoup이 작동하지 않는다면 IronPython이 전체 Python 언어를 구현하지 않기 때문입니다 (CPython과 동일한 방식으로). BeautifulSoup은 순수 파이썬이며 C 확장이 없기 때문에 유일한 문제는 Python 소스 코드와 관련하여 IronPython과 CPython의 호환성입니다. 하나는 없어야하지만,있을 경우 오류가 분명합니다 ("no module named ... ","no method named ... "등). 구글은 IronPython으로 BS 테스트 중 하나만 실패한다고 말합니다. 그것은 아마 작동하고, 그 시험은 지금까지 고쳐질 것입니다. 나는 모른다.

아무도 더 구체적인 것이 없으면 내 조언을 구하십시오.

8

필자는 IPy 1.1 및 2.0 (어떤 베타 버전인지 잊어 버렸지만 몇 달 전 이었음)과 함께 BeautifulSoup를 테스트하고 사용했습니다. 여전히 문제가 있다면 의견을 남겨주세요. 그러면 테스트 코드를 찾아서 게시 할 것입니다.

-2

완벽한 표준 라이브러리와 re 모듈 (IronPython 커뮤니티 에디션 용 Google)이있는 경우 제대로 작동 할 수 있습니다. 하지만 IronPython은 믿을 수없는 나쁜 파이썬 구현입니다.

게다가, html5lib 시도하십시오. 그 파서는 파이어 폭스가 문서를 파싱하는 것과 같은 규칙으로 파싱한다.

+0

내가 IronPython을 사용하지 않지만, : 그냥 바로 폴더에 그것을 가리켜 야 멀리 당신은 갈 ]. – tzot

+0

필자는 철저히 나쁜 IronPython을 고려하지 않았습니다. 그것은 많은 것들을 잘 처리합니다. 그냥 CPython의 드롭 인 대체품이 될 것이라고 기대하지 마십시오. –

1

질문의 두 번째 부분에 대해서는 DLR 호스팅 API를 사용하여 C# 응용 프로그램 내에서 IronPython 코드를 실행할 수 있습니다. DLR 호스팅 사양은 here입니다. 이 blog도 일부 샘플 호스팅 응용 프로그램을 포함합니다.

2

또한 -X : SaveAssemblies로 컴파일하는 것에 대한 이전 의견 중 하나와 관련하여 잘못되었습니다. -X : SaveAssemblies는 디버깅 기능을 의미합니다. Python 코드를 바이너리로 컴파일하기위한 API가 있습니다. This post은 API와 두 모드 간의 차이점을 설명합니다.

1

우리는 40K 라인 IronPython의 응용 프로그램을 배포하는 : 대표 휴일 일정의 미국 하원을 구문 분석 예 : 여기에 편집

간단한 (하지 강력한 전혀 읽기)입니다 . 우리는 전체를 하나의 바이너리로 컴파일 할 수 없었습니다. 대신 우리는 IronPython 모듈별로 하나씩 작은 dll로 배포했습니다. 그래도 잘 작동합니다.

그러나 최근 릴리스 인 IronPython 2.0에서는 모든 항목을 단일 바이너리 파일로 컴파일 할 수있는 최근 스파이크가 있습니다. 또한 응용 프로그램 시작 속도도 빨라집니다 (모듈 가져 오기 속도가 빨라집니다.) 다음 며칠 이내에이 스파이크가 기본 트리로 마이그레이션되기를 바랍니다.

우리는 Wi-X를 사용하고 있습니다.이 도구는 개방형 소스 (또는 적어도 자유롭게 사용할 수있게 만들어진) 인 msi 설치용 Microsoft 내부 도구입니다. 설치에는 꽤 까다로운 요구 사항이 있습니다. WiX를 사용하여 앞으로 다른 IronPython 프로젝트를 배포하는 방법을 확실히 살펴 보겠습니다.

1

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' 
관련 문제