HTML抓取的选项?

时间:2008-08-05 21:09:11

标签: html web-scraping html-parsing html-content-extraction

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

到目前为止的故事:

40 个答案:

答案 0 :(得分:61)

Ruby世界相当于Beautiful Soup是why_the_lucky_stiff的Hpricot

答案 1 :(得分:42)

在.NET世界中,我推荐HTML Agility Pack。不像上面的一些选项(如HTMLSQL)那么简单,但它非常灵活。它可以让你简单地形成HTML,好像它是格式良好的XML,所以你可以使用XPATH或只是迭代节点。

http://www.codeplex.com/htmlagilitypack

答案 2 :(得分:35)

BeautifulSoup是一种很好的HTML抓取方式。我以前的工作让我做了很多刮,我希望当我开始时我知道BeautifulSoup。它就像DOM有更多有用的选项,而且更加pythonic。如果你想尝试Ruby,他们移植了BeautifulSoup,称之为RubyfulSoup,但它暂时没有更新。

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

正则表达式不是很必要。 BeautifulSoup处理正则表达式,所以如果你需要它们的力量,你可以在那里使用它。除非你需要速度和更小的内存占用,否则我说要使用BeautifulSoup。如果您在Python上找到更好的HTML解析器,请告诉我。

答案 3 :(得分:19)

我发现HTMLSQL是一种非常简单的屏幕抓取方式。使用它需要几分钟才能得到结果。

查询非常直观 - 例如:

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

现在有一些其他选择采用相同的方法。

答案 4 :(得分:17)

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

答案 5 :(得分:16)

对于Perl,有WWW :: Mechanize。

答案 6 :(得分:13)

除了Beatiful Soup之外,Python还有几种HTML抓取选项。以下是其他一些内容:

  • mechanize:类似于perl WWW:Mechanize。为您提供类似浏览器的浏览器以使用网页
  • lxml:Python绑定到libwww。支持遍历和选择元素的各种选项(例如XPath和CSS选择)
  • scrapemark:使用模板从HTML中提取信息的高级库。
  • pyquery:允许您对XML文档进行类似jQuery的查询。
  • scrapy:高级抓取和网络抓取框架。它可用于编写蜘蛛,数据挖掘以及监控和自动化测试

答案 7 :(得分:12)

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

答案 8 :(得分:12)

'简单的HTML DOM Parser'是PHP的一个很好的选择,如果您熟悉jQuery或JavaScript选择器,那么您会发现自己在家。

Find it here

There is also a blog post about it here.

答案 9 :(得分:10)

来自Adrian Holovaty(templatemaker成名)的Django实用程序使用了一种非常有趣的方法:您可以将相同页面的变体提供给它并“学习”可变数据的“漏洞”所在的位置。它不是特定于HTML的,因此也可以抓取任何其他纯文本内容。我也将它用于PDF和HTML转换为明文(分别用pdftotext和lynx)。

答案 10 :(得分:8)

我知道并且喜欢Screen-Scraper

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.

答案 11 :(得分:8)

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

答案 12 :(得分:7)

Perl的另一个选项是Web::Scraper,它基于Ruby的Scrapi。简而言之,通过简洁明了的语法,您可以直接在数据结构中获得强大的scraper。

答案 13 :(得分:6)

使用ShoesHpricot抓取Stack Overflow特别容易。

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

答案 14 :(得分:6)

答案 15 :(得分:6)

我在Java中使用HtmlUnit取得了一些成功。它是在Web UI上编写单元测试的简单框架,但对HTML抓取同样有用。

答案 16 :(得分:5)

也有这个解决方案:netty HttpClient

答案 17 :(得分:5)

.NET的另一个工具是MhtBuilder

答案 18 :(得分:4)

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

答案 19 :(得分:4)

我在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 

它非常完整。之前的所有内容都是库导入和我的代理的设置。

答案 20 :(得分:4)

虽然它是专为.NET网络测试而设计的,但我一直在使用WatiN框架来实现此目的。由于它是基于DOM的,因此很容易捕获HTML,文本或图像。接下来,我使用它将MediaWiki所有页面命名空间查询中的链接列表转储到Excel电子表格中。以下VB.NET代码版本非常粗糙,但它有效。


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

答案 21 :(得分:3)

HTML5 parsing algorithm的实现:html5lib(Python,Ruby),Validator.nu HTML Parser(Java,JavaScript;开发中的C ++),Hubbub(C),{{3 (C#;即将发布)。

答案 22 :(得分:3)

我在Perl中使用了LWPHTML::TreeBuilder,发现它们非常有用。

LWP(libwww-perl的缩写)可让您连接到网站并抓取HTML,you can get the module here和O'Reilly图书seems to be online here

TreeBuilder允许您从HTML构建树,以及documentation and source are available in HTML::TreeBuilder - Parser that builds a HTML syntax tree

虽然这种方法可能还有太多繁重的工作。我没有看过另一个答案提出的Mechanize module,所以我可能会这样做。

答案 23 :(得分:3)

好吧,如果您希望仅使用浏览器从客户端完成jcrawl.com。在从Web应用程序(http://www.jcrawl.com/app.html)设计了报废服务之后,您只需将生成的脚本添加到HTML页面即可开始使用/显示您的数据。

所有报废逻辑都通过JavaScript在浏览器上进行。希望对你有帮助。点击此链接可获取提取latest news from Yahoo tennis

的实际示例

答案 24 :(得分:3)

如果不使用Perl,那将是一个傻瓜..这就是火焰......

将以下模块和ginsu搞砸了。

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

答案 25 :(得分:3)

在Java中,您可以使用TagSoup

答案 26 :(得分:2)

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

答案 27 :(得分:2)

我使用SgmlReader在.NET中得到了混合结果,该结果最初由Chris Lovett启动,似乎已由MindTouch更新。

答案 28 :(得分:2)

你可能已经拥有了很多,但我认为这就是你要做的事情:

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")

答案 29 :(得分:2)

我喜欢Google Spreadsheets的ImportXML(URL,XPath)功能。

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

您可以在一个电子表格中拥有最多50个importxml()个功能。

RapidMiner的Web插件也很容易使用。它可以发布帖子,接受cookie,并可以设置user-agent

答案 30 :(得分:1)

我一直在使用Feedity - http://feedity.com在我的图书馆进行一些抓取工作(以及转换为RSS Feed)。它适用于大多数网页。

答案 31 :(得分:1)

我为网页抓取创建了一个非常好的库Internet Tools

我们的想法是将模板与网页相匹配,网页将从页面中提取所有数据,并验证页面结构是否保持不变。

因此,您只需获取要处理的网页的HTML,删除所有动态或不相关的内容,并注释有趣的部分。

E.g。 stackoverflow.com索引页面上的新问题的HTML是:

<div id="question-summary-11326954" class="question-summary narrow">

    <!-- skipped, this is getting too long -->

    <div class="summary">

        <h3><a title="Some times my tree list have vertical scroll ,then I scrolled very fast and the tree list shivered .Have any solution for this.
" class="question-hyperlink" href="/questions/11326954/about-scroll-bar-issue-in-tree">About Scroll bar issue in Tree</a></h3>

    <!-- skipped -->

    </div>
</div>

因此,您只需删除此特定ID,标题和摘要,即可创建一个模板,该模板将读取标题,摘要,链接数组中的所有新问题:

 <t:loop>
   <div class="question-summary narrow">
     <div class="summary">
       <h3>
          <a class="question-hyperlink">
            {title:=text(), summary:=@title, link:=@href}
          </a>
       </h3>
     </div>
   </div>
 </t:loop>

当然它还支持基本技术,CSS 3选择器,XPath 2和XQuery 1表达式。

唯一的问题是,我是如此愚蠢,使它成为一个Free Pascal库。但也有语言独立web demo

答案 32 :(得分:1)

正则表达式也适用于HTML抓取;-)虽然看过Beautiful Soup后,我可以看出为什么这将是一个有价值的工具。

答案 33 :(得分:1)

我做了很多高级网页抓取,所以想要完全控制我的堆栈并理解其局限性。结果是This webscraping library

答案 34 :(得分:1)

Scrubyt使用Ruby和Hpricot进行简单的网页抓取。我用大约30分钟的时间为我大学的图书馆服务写了一个刮刀。

答案 35 :(得分:1)

Dav Glass最近的演讲 Welcome to the Jungle! (YUIConf 2011 Opening Keynote) 展示了如何在 YUI上使用 Node.js 3 在服务器上进行类似客户端的编程(使用DOM选择器而不是字符串处理)。这是非常令人印象深刻的。

答案 36 :(得分:1)

对于更复杂的抓取应用程序,我建议使用IRobotSoft网络刮刀。它是一个专门用于屏幕抓取的免费软件。它具有强大的HTML页面查询语言,它提供了一个非常简单的Web录制界面,可以让您免于许多编程工作。

答案 37 :(得分:0)

对于那些更喜欢图形工作流工具的人来说,RapidMiner(FOSS)有一个很好的网络抓取和抓取工具。

以下是一系列视频:

http://vancouverdata.blogspot.com/2011/04/rapidminer-web-crawling-rapid-miner-web.html

答案 38 :(得分:0)

在服务器端从HTML文档中提取数据时,Node.js是一个很棒的选择。我已成功使用了两个名为requestcheerio的模块。

您可以查看示例工作原理here

答案 39 :(得分:-1)

SharpQuery

它基本上是C#的jQuery。它取决于HTML Agility Pack来解析HTML。