我正在考虑尝试 美丽的汤, ,一个用于 HTML 抓取的 Python 包。还有其他我应该查看的 HTML 抓取包吗?Python 不是必需的,我实际上也有兴趣了解其他语言。

到目前为止的故事:

有帮助吗?

解决方案

Ruby 世界中相当于 Beautiful Soup 的就是 Why_the_lucky_stiff 的 赫普里科特.

其他提示

在 .NET 世界中,我推荐 HTML Agility Pack。不像上面的一些选项(如 HTMLSQL)那么简单,但它非常灵活。它允许您像处理格式良好的 XML 一样操作格式不良的 HTML,因此您可以使用 XPATH 或仅迭代节点。

http://www.codeplex.com/htmlagilitypack

BeautifulSoup 是 HTML 抓取的好方法。我之前的工作让我做了很多抓取工作,我希望我开始时就知道 BeautifulSoup。它就像 DOM,具有更多有用的选项,并且更加 Python 化。如果你想尝试 Ruby,他们移植了 BeautifulSoup,并将其称为 RubyfulSoup,但它已经有一段时间没有更新了。

其他有用的工具是 HTMLParser 或 sgmllib.SGMLParser,它们是标准 Python 库的一部分。这些工作原理是在每次进入/退出标签并遇到 html 文本时调用方法。如果你熟悉的话,他们就像外籍人士。如果您要解析非常大的文件并且创建 DOM 树又长又昂贵,那么这些库特别有用。

正则表达式并不是很有必要。BeautifulSoup 处理正则表达式,因此如果您需要它们的功能,您可以在那里使用它。我建议使用 BeautifulSoup,除非您需要速度和较小的内存占用。如果您在 Python 上找到更好的 HTML 解析器,请告诉我。

我发现 HTMLSQL 成为一种极其简单的屏幕抓取方式。实际上需要几分钟才能得到结果。

这些查询非常直观 - 例如:

SELECT title from img WHERE $class == 'userpic'

现在还有一些采用相同方法的其他替代方案。

蟒蛇 lxml 库充当 libxml2 和 libxslt 库的 Pythonic 绑定。我特别喜欢它的 XPath 支持和内存中 XML 结构的漂亮打印。它还支持解析损坏的 HTML。我认为您找不到比 lxml 更快地解析 XML 的其他 Python 库/绑定。

对于 Perl,有 WWW::Mechanize。

除了 Beatiful Soup 之外,Python 还有多个用于 HTML 抓取的选项。以下是其他一些:

  • 机械化: :类似于perl WWW:Mechanize. 。为您提供一个类似浏览器的对象来与网页交互
  • lxml: :Python 绑定到 libwww. 。支持各种选项来遍历和选择元素(例如 X路径 和 CSS 选择)
  • 刮痕: :使用模板从 HTML 中提取信息的高级库。
  • pyquery: :允许您对 XML 文档进行类似 jQuery 的查询。
  • 刮毛: :高级抓取和网络爬行框架。它可用于编写蜘蛛程序、数据挖掘、监控和自动化测试

“简单 HTML DOM 解析器”对于 PHP 来说是一个不错的选择,如果您熟悉 jQuery 或 JavaScript 选择器,那么您会发现自己很熟悉。

在这里找到它

这里还有一篇关于它的博客文章。

为什么还没有人提到 Java 的 JSOUP? http://jsoup.org/

模板制作者 Adrian Holovaty 的实用程序( 姜戈 Fame)使用了一个非常有趣的方法:你向它提供同一页面的变体,它就会“学习”可变数据的“漏洞”在哪里。它不是特定于 HTML 的,因此它也适合抓取任何其他纯文本内容。我还使用它来将 PDF 和 HTML 转换为纯文本(分别使用 pdftotext 和 lynx)。

我首先会查明相关网站是否提供 API 服务器或 RSS 源来访问您所需的数据。

我知道并且爱 屏幕刮刀.

Screen-Scraper 是一种从网站提取数据的工具。Screen-Scraper 自动化:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

常见用途:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

技术的:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

屏幕抓取工具的三个版本:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.

Perl 的另一个选择是 网络::刮刀 这是基于 Ruby 的 斯克拉皮. 。简而言之,通过漂亮而简洁的语法,您可以将强大的抓取器直接引入数据结构。

抓取堆栈溢出特别容易 赫普里科特.

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end

我已经取得了一些成功 html单元, ,在爪哇语中。它是一个用于在 Web UI 上编写单元测试的简单框架,但对于 HTML 抓取同样有用。

.NET 的另一个工具是 MhtBuilder

也有这样的解决方案: Netty HttpClient

我在 Ruby 上使用 Hpricot。作为示例,这是我用来从 HireThings 帐户的六个页面检索所有书名的代码片段(因为它们似乎没有提供包含此信息的单个页面):

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

已经很完整了。在此之前的所有内容都是库导入和代理设置。

我在 Python 中经常使用 Beautiful Soup。它比正则表达式检查要好得多,因为它的工作原理就像使用 DOM, ,即使 HTML 格式很差。您可以使用比正则表达式更简单的语法快速查找 HTML 标签和文本。一旦找到一个元素,您就可以迭代它及其子元素,这比使用正则表达式更有助于理解代码中的内容。我希望 Beautiful Soup 早在几年前就已经存在了,当时我必须做大量的屏幕抓取工作——这会节省我大量的时间和头痛,因为在人们开始验证它之前 HTML 结构是如此糟糕。

虽然它的设计目的是 。网 网络测试,我一直在使用 等待 为此目的的框架。由于它是基于 DOM 的,因此捕获 HTML、文本或图像非常容易。最近,我用它来转储来自 媒体维基 所有 Pages 命名空间查询到 Excel 电子表格中。下列 网络 代码片段相当粗糙,但它有效。


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub

的实施 HTML5解析算法: html5库 (Python、Ruby)、 Validator.nu HTML 解析器 (Java、JavaScript;C++ 正在开发中), 尘嚣 (C), 双特萨姆 (C#;即将推出)。

如果不使用 Perl,你就是个傻瓜。火焰来了..

认真研究以下模块,并避免任何刮擦的情况。

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

我用过 轻量级水压HTML::树构建器 并发现它们非常有用。

LWP(libwww-perl 的缩写)可让您连接到网站并抓取 HTML, 你可以在这里获取模块 和奥莱利的书 这里好像在线.

TreeBuilder 允许您从 HTML 构建树,并且 文档和来源可在 HTML::TreeBuilder - 构建 HTML 语法树的解析器.

不过,像这种方法可能还有太多繁重的工作要做。我还没看过 机械化模块 另一个答案建议的,所以我很可能会这样做。

在Java中,你可以使用 标签汤.

好吧,如果您希望仅使用您拥有的浏览器从客户端完成此操作 jcrawl.com. 。从网络应用程序设计了您的抓取服务后(http://www.jcrawl.com/app.html),您只需将生成的脚本添加到 HTML 页面即可开始使用/呈现您的数据。

所有的抓取逻辑都通过 JavaScript 在浏览器上发生。希望对你有帮助。单击此链接查看提取的实时示例 来自雅虎网球的最新消息.

您可能已经拥有这么多,但我认为这就是您想要做的:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")

我在 .NET 中使用 SgmlReader 得到了混合结果,该结果最初由 克里斯·洛维特 并且似乎已更新 心灵触动.

我喜欢 Google 电子表格的 ImportXML(URL, XPath) 函数。

如果您的 XPath 表达式返回多个值,它将沿列重复单元格。

您最多可以拥有 50 个 importxml() 一个电子表格上的函数。

RapidMiner 的 Web 插件也非常易于使用。它可以发帖、接受 cookie,并可以设置 用户代理.

我还使用 Aptana 的 Jaxer + jQuery 来解析页面,取得了巨大成功。它本质上没有那么快或“类似脚本”,但 jQuery 选择器 + 真正的 JavaScript/DOM 是更复杂(或格式错误)页面的救星。

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