使用 Python 进行网页抓取 [关闭]
-
25-09-2019 - |
题
我目前正在尝试抓取一个 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 。
您可能想看看机械化模块:
那么,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>
这个看起来对我好,我用它自己:链接