Python网络爬虫

9
我目前正在试图抓取一个HTML格式不太标准的网站(经常缺少关闭标签,没有使用类或ID,因此很难直接定位到所需元素等)。我已经尝试使用BeautifulSoup,并取得了一些成功,但偶尔会遇到一个问题(虽然很少见),即BeautifulSoup创建的HTML树与Firefox或Webkit创建的略有不同。虽然这是可以理解的,因为HTML的格式可能存在歧义,但如果我能够获得与Firefox或Webkit生成的相同的解析树,那么我就能更轻松地解析内容。问题通常是网站会两次打开<b>标签,当BeautifulSoup看到第二个<b>标签时,它会立即关闭第一个,而Firefox和Webkit则将<b>标签嵌套起来。
是否有Python(甚至其他语言)的网络爬虫库能够重现Firefox或WebKit生成的解析树(或者至少在存在歧义的情况下比BeautifulSoup更接近)?

为什么不直接使用Webkit呢? Webkit是开源的。是的,需要花一点时间适应。 - amit kumar
1
你有没有告诉BeautifulSoup小组?他们可能对像你这样的边缘情况感兴趣。http://groups.google.com/group/beautifulsoup - John La Rooy
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>

4

3

你尝试过Scrapy吗?

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


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

2

1

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


1

1

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

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


0
根据文档,ICantBelieveItsBeautifulSoup 解析器似乎是您想要的:

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


0

这个看起来不错,我自己也在使用它:link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接