문제

아름다운 수프가 아이언 파이톤과 잘 어울릴까요?그렇다면 어떤 버전의 Iron Python이 사용됩니까?Iron Python(주로 HTML을 구문 분석하기 위해 일부 Python 코드를 호출하는 C#)을 사용하여 .net 2.0에 Windows 데스크톱 앱을 배포하는 것이 얼마나 쉬운가요?

도움이 되었습니까?

해결책

나는 나 자신에게 이와 같은 질문을 하고 있었고 IronPython과 BeautifulSoup이 내 기존 코드와 잘 작동하도록 하기 위해 여기저기서 조언을 따르려고 애쓴 후에 대체 네이티브 .NET 솔루션을 찾기로 결정했습니다.BeautifulSoup은 훌륭한 코드이며 처음에는 .NET에 비교할 수 있는 코드가 없는 것처럼 보였지만 나중에는 다음과 같은 코드를 발견했습니다. HTML 민첩성 팩 그리고 내 생각엔 BeautifulSoup에 비해 실제로 유지 관리 능력이 어느 정도 향상되었다고 생각합니다.이는 깨끗하거나 거친 HTML을 가져와서 XPath를 통해 쿼리할 수 있는 우아한 XML DOM을 생성합니다.몇 줄의 코드를 사용하면 원시 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();
        }
    }
}

다른 팁

나는 IPy 1.1과 2.0 모두에서 BeautifulSoup을 테스트하고 사용했습니다(어떤 베타인지는 잊어버리세요. 몇 달 전의 일입니다).여전히 문제가 있는 경우 댓글을 남겨주시면 테스트 코드를 찾아 게시해 드리겠습니다.

BeautifulSoup이 IronPython에서 작동하지 않는다면 이는 IronPython이 전체 Python 언어를 구현하지 않기 때문입니다(CPython과 동일한 방식).BeautifulSoup은 C 확장이 없는 순수 Python이므로 유일한 문제는 Python 소스 코드 측면에서 IronPython과 CPython의 호환성입니다. 하나도 있어서는 안 되지만, 만약 있다면 오류가 분명할 것입니다("모듈 없음") ...라는 이름의 메서드가 없습니다.", "...라는 이름의 메서드가 없습니다." 등).Google은 IronPython에서 BS의 테스트 중 하나만 실패했다고 말합니다.아마 작동할 것이고, 그 테스트는 지금쯤 수정되었을 것입니다.나는 모른다.

더 구체적인 내용이 없다면 시도해 보고 확인하는 것이 내 조언이 될 것입니다.

또한 -X:SaveAssemblies를 사용하여 컴파일하는 것에 대한 이전 설명 중 하나와 관련하여 이는 잘못된 것입니다.-X:SaveAssemblies는 디버깅 기능을 의미합니다.Python 코드를 바이너리로 컴파일하기 위한 API가 있습니다. 이 게시물 API와 두 모드의 차이점을 설명합니다.

질문의 두 번째 부분과 관련하여 DLR 호스팅 API를 사용하여 C# 애플리케이션 내에서 IronPython 코드를 실행할 수 있습니다.DLR 호스팅 사양은 다음과 같습니다. 여기.이것 블로그 일부 샘플 호스팅 애플리케이션도 포함되어 있습니다.

우리는 40k 라인의 IronPython 애플리케이션을 배포하고 있습니다.우리는 모든 것을 단일 바이너리 배포 가능 파일로 컴파일할 수 없었습니다.대신 우리는 각 IronPython 모듈마다 하나씩, 엄청나게 작은 dll을 배포해 왔습니다.그래도 잘 작동합니다.

그러나 최신 릴리스인 IronPython 2.0에서는 모든 것을 단일 바이너리 파일로 컴파일할 수 있는 것으로 보이는 최근 스파이크가 발생했습니다.이로 인해 애플리케이션 시작도 더 빨라집니다(모듈 가져오기가 더 빠릅니다.) 이 스파이크가 앞으로 며칠 내에 메인 트리로 마이그레이션되기를 바랍니다.

배포를 위해 우리는 msi 설치를 생성하기 위한 Microsoft 내부 도구인 WiX를 사용하고 있습니다. WiX는 오픈 소스(또는 적어도 무료로 제공됨)입니다. 설치에 꽤 많은 시간이 걸렸음에도 불구하고 아무런 문제가 없었습니다. 까다로운 요구 사항.앞으로 다른 IronPython 프로젝트를 배포하기 위해 WiX를 사용하는 방법을 확실히 살펴볼 것입니다.

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 모듈(IronPython 커뮤니티 에디션용 Google)이 작동할 수 있습니다.그러나 IronPython은 믿을 수 없을 정도로 나쁜 Python 구현이므로 나는 그것을 믿지 않을 것입니다.

게다가 줘 html5lib 시도.해당 파서는 Firefox가 문서를 구문 분석하는 것과 동일한 규칙으로 구문 분석합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top