9

我目前正在尝试抓取一个 HTML 格式相当糟糕的网站(通常缺少结束标签,不使用类或 ID,因此很难直接找到您想要的元素等)。到目前为止,我一直在使用 BeautifulSoup 并取得了一些成功,但每隔一段时间(尽管很少),我会遇到一个页面,在该页面中,BeautifulSoup 创建的 HTML 树与(例如)Firefox 或 Webkit 有点不同。虽然这是可以理解的,因为 HTML 的格式使这种模棱两可,但如果我能够获得与 Firefox 或 Webkit 生成的相同的解析树,我将能够更轻松地解析事物。问题通常是网站打开一个<b>标签两次,当 BeautifulSoup 看到第二个<b>标签时,它立即关闭第一个标签,而 Firefox 和 Webkit 嵌套<b>标签。

是否有 Python(甚至任何其他语言(我快要绝望了))的网络抓取库可以重现 Firefox 或 WebKit 生成的解析树(或者在模棱两可的情况下至少比 BeautifulSoup 更接近)。

4

10 回答 10

10

用作BeautifulSoup树构建器html5lib

from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))

text = "a<b>b<b>c"
soup = parser.parse(text)
print soup.prettify()

输出:

<html>
 <head>
 </head>
 <body>
  a
  <b>
   b
   <b>
    c
   </b>
  </b>
 </body>
</html>
于 2010-03-07T23:23:04.497 回答
4

pyWebKitGTK看起来可能会有所帮助。

还有一个家伙必须做同样的事情,但是在 javascript 运行后导出内容,使用 pyWebKitGTK 从 python 执行 javascript

Cheeseshop 的pyWebkitGTK

您也可以使用 pyQt 执行此操作

于 2010-03-07T19:47:34.380 回答
3

你试过scrapy吗?

Scrapy 是一个快速的高级屏幕抓取和网络抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于广泛的用途,从数据挖掘到监控和自动化测试。

于 2010-03-28T10:56:28.823 回答
2

您可以使用SeleniumRC驱动您选择的浏览器。

于 2010-03-07T18:18:06.477 回答
2

您可能想看看 Mechanize 模块:

http://wwwsearch.sourceforge.net/mechanize/

于 2010-03-07T19:14:11.003 回答
1

好吧,WebKit 是开源的,因此如果可以接受任何语言,您可以使用它自己的解析器(在 WebCore 组件中)

于 2010-03-07T18:12:48.537 回答
1

Ian Bicking 曾经写道,令人惊讶的是,lxml 在解析汤方面可能比 BeautifulSoup 更好:http ://blog.ianbicking.org/2008/12/10/lxml-an-underappreciated-web-scraping-library/ (仅供参考,没有亲自尝试过)

于 2010-03-07T19:22:25.887 回答
1

您可以在beautifulsoup中使用lxml解析器,并使用xpath在未格式化的html页面中查找数据,您可以在使用firebug检查元素时复制xpath。

您可以查看本教程: http ://www.youtube.com/watch?v=PgWfF-Ut0zM

于 2012-07-12T00:08:34.423 回答
0

从文档看来ICantBelieveItsBeautifulSoup解析器是你想要的:

ICantBelieveItsBeautifulSoup 也是 BeautifulSoup 的子类。它具有更接近 HTML 标准的 HTML 启发式方法,但忽略了 HTML 在现实世界中的使用方式。例如,嵌套 <B> 标签是有效的 HTML,但在现实世界中,嵌套的 <B> 标签几乎总是意味着作者忘记关闭第一个 <B> 标签。如果您遇到实际嵌套 <B> 标记的人,那么您可以使用 ICantBelieveItsBeautifulSoup。

于 2010-04-19T05:14:03.610 回答
0

这个对我来说看起来不错,我自己正在使用它:链接

于 2011-05-19T13:42:24.057 回答