2008-09-23 24 views
21

美麗的湯配鐵蟒嗎? 如果是這樣用哪個版本的python python? 它使用鐵python(主要是C#調用一些python代碼來解析html)在.net 2.0上發佈windows桌面應用程序有多簡單?鐵蟒,美麗的湯,win32應用程序

回答

34

我在問自己同樣的問題,在努力遵循這裏和其他地方的建議讓IronPython和BeautifulSoup與我現有的代碼很好地玩,我決定去尋找替代的本地.NET解決方案。 BeautifulSoup是一段很棒的代碼,起初它看起來並不像.NET有什麼可比性,但後來我發現了HTML Agility Pack,如果有什麼我認爲我實際上已經在BeautifulSoup上獲得了一些可維護性。它需要乾淨或粗糙的HTML,並從中產生一個優雅的XML DOM,可以通過XPath查詢。用幾行代碼,你甚至可以找回原始的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

我還沒有測試過,但我會說它很可能會使用最新的IPy2。

至於分配,這很簡單。使用-X:SaveAssemblies選項將Python代碼編譯爲二進制文件,然後將其與其他DLL和IPy依賴關係一起發送。

5

如果BeautifulSoup不適用於IronPython,那是因爲IronPython沒有實現整個Python語言(與CPython一樣)。 BeautifulSoup是純python,沒有C擴展,所以唯一的問題是IronPython與CPython在Python源代碼方面的兼容性。不應該有一個,但如果存在的話,錯誤將是顯而易見的(「no module命名...「,」無方法命名...「等)。谷歌說,只有一個BS的測試失敗與IronPython。它可能有效,而且現在可以修復該測試。我不知道。

試一下,看看,會是我的建議,除非任何人有更具體的東西。

8

我測試過並使用了BeautifulSoup與IPy 1.1和2.0(忘記哪個測試版,但是這是幾個月前)。如果您仍然遇到問題,請發表評論,我會挖掘我的測試代碼併發布。

-2

如果你有完整的標準庫和真實的re模塊(谷歌for IronPython社區版),它可能會工作。但IronPython是一個令人難以置信的糟糕的Python實現,我不會指望這一點。

另外,給html5lib一試。解析器使用相同的規則解析文件。

+0

我不使用IronPython的,但我到目前爲止已經讀到它不保證了「非常糟糕的Python實現」 [錯字固定]。 – tzot 2008-09-23 10:20:06

+0

我當然不認爲IronPython是非常糟糕的。它對很多東西都很好。只是不要指望它成爲CPython的替代品。 – 2010-01-08 09:07:40

1

關於問題的第二部分,您可以使用DLR Hosting API從C#應用程序中運行IronPython代碼。 DLR託管規範是here。這blog還包含一些示例託管應用程序

2

另外,關於與-X:SaveAssemblies編譯的先前評論之一,這是錯誤的。 -X:SaveAssemblies意味着一個調試功能。有一個API用於將Python代碼編譯爲二進制文件。 This post解釋了API和兩種模式的區別。

1

我們正在分發40K線IronPython的應用程序,它解析出的代表假期安排在美國衆議院例子。我們無法將整個事件編譯成單個二進制可分發版本。相反,我們已經將它作爲一個數十億個小型dll分發給每個IronPython模塊。這工作得很好,但。

然而,在較新的版本IronPython 2.0中,我們有一個最近的高峯,它似乎能夠將所有東西編譯成一個二進制文件。這也導致應用程序啓動速度加快(模塊導入速度更快)。希望在未來幾天內,這個峯值會遷移到我們的主樹中。

爲了做到這一點,我們使用的是WiX,它是微軟內部創建msi安裝的工具,它已經被開源(或者至少可以自由使用)。它沒有給我們帶來任何問題,儘管我們的安裝有一些相當繁瑣的要求。我一定會在未來使用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'