سؤال

هل شوربة جميلة تعمل مع الحديد الثعبان ؟ إذا كان الأمر كذلك مع أي إصدار من الحديد الثعبان ؟ كيف هو أنه من السهل توزيع ويندوز سطح المكتب التطبيق على .net 2.0 باستخدام الحديد بايثون (في الغالب c# استدعاء بعض الثعبان رمز تحليل html)?

هل كانت مفيدة؟

المحلول

كنت أسأل نفسي نفس السؤال و بعد تكافح من أجل اتباع النصيحة هنا و في أماكن أخرى للحصول على IronPython و BeautifulSoup للعب بشكل جيد مع بلدي البرمجية الموجودة قررت أن تذهب تبحث عن بديل الأم .صافي الحل.BeautifulSoup رائعة قليلا من التعليمات البرمجية في البداية لم يبد أن هناك أي شيء للمقارنة المتاحة .صافي ، ولكن بعد ذلك وجدت HTML Agility Pack وإذا كان أي شيء أعتقد أنني قد اكتسبت بالفعل بعض الصيانة على BeautifulSoup.فإنه يأخذ نظيفة أو crufty 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();
        }
    }
}

نصائح أخرى

لقد اختبر BeautifulSoup مع كل من السنة 1.1 و 2.0 (ننسى والتي بيتا, ولكن هذا كان قبل بضعة أشهر).ترك تعليق إذا كنت لا تزال تواجه مشكلة وأنا انتشال بلدي رمز اختبار وما بعد ذلك.

إذا BeautifulSoup لا يعمل على IronPython, لأن IronPython لا تنفذ كل لغة بيثون (نفس طريقة CPython لا).BeautifulSoup هو محض-الثعبان لا ج-امتداد لذلك المشكلة الوحيدة هي توافق IronPython مع CPython حيث بيثون التعليمات البرمجية المصدر.لا ينبغي أن يكون هناك واحد ، ولكن إذا كان هناك خطأ سوف تكون واضحة ("لا وحدة اسمه ...", "لا توجد طريقة اسمها ..." ، الخ.).وتقول جوجل أن واحدا فقط من BS الاختبارات فشل مع IronPython.ربما يعمل و هذا الاختبار قد تكون ثابتة من قبل الآن.أنا لا أعرف.

انها محاولة ونرى ستكون نصيحتي إلا إذا كان أي شخص لديه أي شيء أكثر تحديدا.

وفيما يتعلق أيضا واحد من التعليقات السابقة حول تجميع مع -X:SaveAssemblies - وهذا هو الخطأ.-س:SaveAssemblies هو المقصود كما التصحيح الميزة.هناك API يعني تجميع كود بايثون في الثنائيات. هذا المنصب يشرح API و الفرق بين الوضعين.

بخصوص الجزء الثاني من السؤال الخاص بك, يمكنك استخدام DLR استضافة واجهات برمجة التطبيقات لتشغيل IronPython البرمجية من خلال C# التطبيق.DLR استضافة المواصفات هي هنا.هذا بلوق يحتوي أيضا على بعض العينات استضافة التطبيقات

ونحن توزيع 40k خط IronPython التطبيق.نحن لم تكن قادرة على تجميع كل شيء في واحدة الثنائية القابلة للتوزيع.بدلا من ذلك لدينا تم توزيعه كما زليون صغيرة dlls واحد لكل IronPython وحدة.هذا يعمل بشكل جيد على الرغم من.

ومع ذلك ، على الإصدار الأحدث, IronPython 2.0 لدينا الارتفاع الأخير الذي يبدو أن تكون قادرة على تجميع كل شيء في ملف ثنائي واحد.هذا أيضا النتائج في أسرع بدء التطبيق أيضا (وحدة استيراد أسرع.) نأمل أن هذا الارتفاع سوف يهاجر إلى الشجرة الرئيسية في الأيام القليلة المقبلة.

للقيام توزيع نحن نستخدم WiX, وهو Microsoft الداخلية أداة لخلق msi تثبيت هذا وقد مفتوح المصدر (أو متاحة بحرية على الأقل.) وقد قدم لنا أي مشاكل ، على الرغم من تثبيت بعض جدا ذكي المتطلبات.أنا سوف بالتأكيد ننظر في استخدام WiX لتوزيع أخرى IronPython المشاريع في المستقبل.

يبدو أن تعمل على ما يرام مع 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 خيار تجميع كود بايثون إلى ثنائي ومن ثم شحنه مع DLLs و السنة التبعيات.

إذا كان لديك كاملة المكتبة القياسية الحقيقي re وحدة (جوجل IronPython المجتمع edition) قد عمل.ولكن IronPython لا يصدق سوء تنفيذ الثعبان, أنا لا أعتمد على ذلك.

الى جانب ذلك ، تعطي html5lib المحاولة.هذا محلل يوزع مع نفس القواعد فايرفوكس يوزع وثائق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top