2008-09-23 16 views
21

क्या सुंदर सूप लौह अजगर के साथ काम करता है? यदि ऐसा है तो लोहे के अजगर के किस संस्करण के साथ? लौह पायथन (ज्यादातर सी # को पार्सिंग एचटीएमएल के लिए कुछ पायथन कोड) का उपयोग करते हुए .नेट 2.0 पर विंडोज डेस्कटॉप ऐप वितरित करना कितना आसान है?आयरन पायथन, सुंदर सूप, win32 ऐप

उत्तर

34

मैं खुद को यही प्रश्न पूछ रहा था और आयरनपीथन और सुंदर सूप को अपने मौजूदा कोड के साथ अच्छी तरह से खेलने के लिए सलाह देने के लिए यहां और अन्य जगहों पर सलाह देने के बाद मैंने वैकल्पिक मूल .NET समाधान की तलाश करने का फैसला किया। सुंदर सूप कोड का एक अद्भुत बिट है और पहले ऐसा नहीं लगता था कि .NET के लिए कुछ भी तुलनीय उपलब्ध था, लेकिन फिर मुझे HTML Agility Pack मिला और यदि मुझे लगता है कि मुझे वास्तव में सुंदर सूप पर कुछ रखरखाव प्राप्त हुआ है। यह साफ या क्रूर HTML लेता है और इससे एक सुरुचिपूर्ण एक्सएमएल डोम उत्पन्न करता है जिसे 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

एचएपी एक अच्छा समाधान है, मुझे इसका उपयोग करके उत्पादन में ऐप्स का एक गुच्छा मिला है। मैंने मोज़िला एचटीएमएल पार्सर का उपयोग किया है और इसमें कोई फर्क नहीं पड़ता है। –

0

मैंने इसका परीक्षण नहीं किया है, लेकिन मैं कहूंगा कि यह नवीनतम आईपी 2 के साथ सबसे अधिक काम करेगा।

वितरण के लिए, यह बहुत आसान है। अपने पाइथन कोड को बाइनरी में संकलित करने के लिए -X: SaveAssemblies विकल्प का उपयोग करें और फिर इसे अपने अन्य डीएलएल और आईपी निर्भरताओं के साथ शिप करें।

5

यदि सुंदर सूप आयरनपीथन पर काम नहीं करता है, तो ऐसा इसलिए है क्योंकि आयरनपीथन पूरे पायथन भाषा को लागू नहीं करता है (उसी तरह सीपीथन करता है)। सुंदर सूप शुद्ध-पायथन है, कोई सी-एक्सटेंशन नहीं है, इसलिए केवल समस्या ही पाइथन स्रोत कोड के संदर्भ में सीपीथॉन के साथ आयरनपीथन की संगतता है। एक नहीं होना चाहिए, लेकिन यदि वहां है, तो त्रुटि स्पष्ट होगी ("कोई मॉड्यूल नहीं नामित ... "," कोई विधि नाम नहीं ... ", आदि)। Google का कहना है कि बीएस के परीक्षणों में से केवल एक आयरनपीथन के साथ विफल रहता है। यह शायद काम करता है, और वह परीक्षण अब तक तय किया जा सकता है। मुझे नहीं पता

इसे आज़माएं और देखें, मेरी सलाह होगी, जब तक कि किसी के पास कुछ और ठोस न हो।

8

मैंने आईपी 1.1 और 2.0 दोनों के साथ सुंदर सूप का परीक्षण किया है और इसका उपयोग किया है (बीटा भूल जाओ, लेकिन यह कुछ महीने पहले था)। अगर आपको अभी भी परेशानी हो रही है तो एक टिप्पणी छोड़ दो और मैं अपना टेस्ट कोड खोद दूंगा और इसे पोस्ट करूंगा।

-2

यदि आपके पास पूर्ण मानक लाइब्रेरी है और असली re मॉड्यूल (आयरनपीथन समुदाय संस्करण के लिए Google) यह काम कर सकता है। लेकिन आयरनपीथन एक अविश्वसनीय बुरा पायथन कार्यान्वयन है, मैं उस पर भरोसा नहीं करता।

इसके अलावा, html5lib एक प्रयास दें। वह पार्सर उसी नियम के साथ पार्सफॉक्स पार्स दस्तावेज करता है।

+0

मैं IronPython का उपयोग नहीं करते हैं, लेकिन मैं अब तक क्या पढ़ा के बारे में यह "अविश्वसनीय रूप से बुरा अजगर कार्यान्वयन" प्रमाणित नहीं करता [टाइपो तय ]। – tzot

+0

मैं निश्चित रूप से आयरनपीथन को अविश्वसनीय रूप से खराब मानता नहीं हूं। यह सामानों के भार पर ठीक है। बस यह उम्मीद नहीं है कि यह सीपीथॉन के लिए एक ड्रॉप-इन प्रतिस्थापन हो। –

1

अपने प्रश्न के दूसरे भाग के संबंध में, आप सी # अनुप्रयोग के भीतर से आयरनपीथन कोड चलाने के लिए डीएलआर होस्टिंग एपीआई का उपयोग कर सकते हैं। डीएलआर होस्टिंग स्पेक here है। यह blog में कुछ नमूना होस्टिंग अनुप्रयोग भी शामिल हैं

2

इसके अलावा, -X: SaveAssemblies के साथ संकलन के बारे में पिछली टिप्पणियों में से एक के बारे में - यह गलत है। -एक्स: SaveAssemblies एक डिबगिंग सुविधा के रूप में है। पाइथन कोड को बाइनरी में संकलित करने के लिए एक एपीआई है। This post एपीआई और दो मोड के बीच अंतर बताता है।

1

हम एक 40k लाइन IronPython आवेदन वितरण कर रहे हैं:

संपादित

यहाँ एक सरल (बिल्कुल नहीं मजबूत पढ़ें) है । हम पूरी चीज को एक बाइनरी वितरित करने में सक्षम नहीं कर पाए हैं। इसके बजाय हम इसे एक अरब टन छोटे डीएलएस के रूप में वितरित कर रहे हैं, प्रत्येक आयरनपीथन मॉड्यूल के लिए। हालांकि यह ठीक काम करता है।

हालांकि, नई रिलीज पर, आयरनपीथन 2.0, हमारे पास हालिया स्पाइक है जो सब कुछ एक बाइनरी फ़ाइल में संकलित करने में सक्षम है। इसके परिणामस्वरूप तेजी से एप्लिकेशन स्टार्ट-अप भी होता है (मॉड्यूल आयात तेजी से होता है।) उम्मीद है कि यह स्पाइक अगले कुछ दिनों में हमारे मुख्य पेड़ में माइग्रेट हो जाएगा।

वितरण करने के लिए हम वाईएक्स का उपयोग कर रहे हैं, जो एमएसआई इंस्टॉल बनाने के लिए एक माइक्रोसॉफ्ट आंतरिक उपकरण है, जिसे ओपन-सोर्स किया गया है (या कम से कम उपलब्ध कराया गया है, कम से कम।) इसने हमें कोई समस्या नहीं दी है, भले ही हमारे स्थापित कुछ काफी जरूरत है। मैं निश्चित रूप से भविष्य में अन्य आयरनपीथन परियोजनाओं को वितरित करने के लिए वाईएक्स का उपयोग करने पर विचार करूंगा।

1

आयरनपीथन 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' 
संबंधित मुद्दे