【发布时间】:2009-07-18 09:24:49
【问题描述】:
我正在尝试使用 python 程序从各种 HTML 页面中提取一些数据。不幸的是,其中一些页面包含用户输入的数据,这些数据偶尔会出现“轻微”错误——即标签不匹配。
有没有一种好方法可以让 python 的 xml.dom 尝试纠正错误或类似的东西?或者,是否有更好的方法从可能包含错误的 HTML 页面中提取数据?
【问题讨论】:
标签: python xml dom expat-parser
我正在尝试使用 python 程序从各种 HTML 页面中提取一些数据。不幸的是,其中一些页面包含用户输入的数据,这些数据偶尔会出现“轻微”错误——即标签不匹配。
有没有一种好方法可以让 python 的 xml.dom 尝试纠正错误或类似的东西?或者,是否有更好的方法从可能包含错误的 HTML 页面中提取数据?
【问题讨论】:
标签: python xml dom expat-parser
您可以使用HTML Tidy 进行清理,或者使用Beautiful Soup 进行解析。可能是您必须将结果保存到临时文件,但它应该可以工作。
干杯,
【讨论】:
我曾经使用 BeautifulSoup 来完成此类任务,但现在我已转向 HTML5lib (http://code.google.com/p/html5lib/),它在 BeautifulSoup 失败的许多情况下都能正常工作
另一种选择是使用“Element Soup”(http://effbot.org/zone/element-soup.htm),它是使用 ElementTree 的 Beautiful Soup 的包装器
【讨论】:
lxml 在解析无效 HTML 方面做得不错。
根据他们的文档Beautiful Soup 和html5lib 有时会根据输入表现更好。使用 lxml,您可以选择使用哪个解析器,并通过统一的 API 访问它们。
【讨论】:
如果您可以接受 jython,tagsoup 非常擅长解析垃圾 - 如果是,我发现 jdom 库比其他 xml 替代品更容易使用。
这是一个演示样机的 sn-p,与 tfl 的旅程规划器的屏幕抓取有关:
私有文档 getRoutePage(HashMap params) 抛出异常 { 字符串 uri = "http://journeyplanner.tfl.gov.uk/bcl/XSLT_TRIP_REQUEST2"; HttpWrapper hw = 新的 HttpWrapper(); String page = hw.urlEncPost(uri, params); SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); 阅读器 pageReader = new StringReader(page); 返回 builder.build(pageReader); }【讨论】: