铁Python、Beautiful Soup、Win32应用
美丽汤(Beautiful Soup)能在IronPython上使用吗?如果可以的话,支持哪个版本的IronPython?使用IronPython在.net 2.0上分发一个Windows桌面应用程序有多简单呢?这个应用程序主要是用C#调用一些Python代码来解析HTML。
10 个回答
如果BeautifulSoup在IronPython上不工作,那是因为IronPython没有完全实现Python语言,就像CPython那样。BeautifulSoup是纯Python写的,没有使用C语言的扩展,所以问题只在于IronPython和CPython在Python源代码上的兼容性。理论上应该没有问题,但如果有的话,错误信息会很明显,比如“没有这个模块...”或者“没有这个方法...”。谷歌上说,只有一个BeautifulSoup的测试在IronPython上失败。可能它是可以工作的,而且那个测试现在可能已经修复了。我也不太确定。
我建议你试试看,除非有人有更具体的信息。
我之前用过BeautifulSoup这个工具,测试过IPy 1.1和2.0版本(具体哪个测试版我忘了,不过是几个月前的事了)。如果你还有问题,可以留言告诉我,我会找出我当时的测试代码并分享给你。
我之前也在想这个问题,尝试按照这里和其他地方的建议,让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();
}
}
}