铁Python、Beautiful Soup、Win32应用

21 投票
10 回答
8972 浏览
提问于 2025-04-11 09:19

美丽汤(Beautiful Soup)能在IronPython上使用吗?如果可以的话,支持哪个版本的IronPython?使用IronPython在.net 2.0上分发一个Windows桌面应用程序有多简单呢?这个应用程序主要是用C#调用一些Python代码来解析HTML。

10 个回答

5

如果BeautifulSoup在IronPython上不工作,那是因为IronPython没有完全实现Python语言,就像CPython那样。BeautifulSoup是纯Python写的,没有使用C语言的扩展,所以问题只在于IronPython和CPython在Python源代码上的兼容性。理论上应该没有问题,但如果有的话,错误信息会很明显,比如“没有这个模块...”或者“没有这个方法...”。谷歌上说,只有一个BeautifulSoup的测试在IronPython上失败。可能它是可以工作的,而且那个测试现在可能已经修复了。我也不太确定。

我建议你试试看,除非有人有更具体的信息。

8

我之前用过BeautifulSoup这个工具,测试过IPy 1.1和2.0版本(具体哪个测试版我忘了,不过是几个月前的事了)。如果你还有问题,可以留言告诉我,我会找出我当时的测试代码并分享给你。

34

我之前也在想这个问题,尝试按照这里和其他地方的建议,让IronPython和BeautifulSoup能够顺利地与我现有的代码配合,但最后我决定寻找一个本土的.NET解决方案。BeautifulSoup确实是个很棒的工具,起初我觉得在.NET上没有类似的东西,但后来我发现了HTML Agility Pack,而且我觉得它在可维护性上甚至比BeautifulSoup更好。它可以处理干净或杂乱的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();
        }
    }
}

撰写回答