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

是否有一个Python(甚至任何其他语言(我越来越绝望))的网络抓取库可以重现由Firefox或WebKit生成的解析树(或者至少在歧义的情况下比BeautifulSoup更接近)。

有帮助吗?

解决方案

使用 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>

其他提示

pyWebKitGTK 看起来可能会有一些帮助。

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

pyWebkitGTK 位于 奶酪店.

你也可以 用 pyQt 来做这个.

你试过 scrapy

  

Scrapy是一个快速的高级别屏幕   刮和Web爬行框架,   用来抓取网站并提取   从他们的网页结构化数据。它   可用于范围广泛的   目的,从数据挖掘   监测和自动测试。

您可以驾驶您选择的浏览器 SeleniumRC

您可能想看看机械化模块:

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

那么,WebKit是开源所以可以使用它自己的解析器(在WebCore的组分),如果任何语言是可接受的

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

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

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

从文档看来 我不敢相信它的汤很美 解析器就是你想要的:

Icantbelieveitsbeautifuloupeup也是美丽的子类的子类。它具有HTML启发式方法,它更符合HTML标准,但忽略了HTML在现实世界中的使用方式。例如,嵌套u003CB>标签是有效的HTML,但是在现实世界中,嵌套u003CB>标签几乎总是意味着作者忘记关闭第一个u003CB>标签。u003C/b>u003C/b>u003C/b>如果您遇到了真正嵌套u003CB>标签的人,则可以使用icantbelieveitsbeautifulsoup。u003C/b>

这个看起来对我好,我用它自己:链接

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top