HTML抓取的选项?

Mar*_*son 401 html html-parsing html-content-extraction web-scraping

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

到目前为止的故事:

Joe*_*lla 63

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

  • 这些天Ruby人员已经切换到[Nokogiri](http://nokogiri.org/)进行抓取. (12认同)

Jon*_*way 43

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

http://www.codeplex.com/htmlagilitypack

  • 将SharpQuery与它结合使用,就像jQuery一样!http://code.google.com/p/sharp-query/ (3认同)
  • 将linq与它结合起来,它看起来更像是HTMLSQL,不是吗? (2认同)

Cri*_*ian 36

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

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

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


dea*_*mer 20

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

查询非常直观 - 如:

SELECT title from img WHERE $class == 'userpic'
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考,这是一个PHP库 (7认同)

aka*_*ola 18

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


and*_*wrk 17

对于Perl,有WWW :: Mechanize.


小智 15

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

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


Ora*_*Box 13

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

在这里找到它

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


小智 13

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


aka*_*ola 10

来自Adrian Holovaty(Django成名)的模板制作工具使用了一种非常有趣的方法:您可以将相同页面的变体提供给它,并"学习"可变数据的"漏洞".它不是特定于HTML的,因此也可以抓取任何其他纯文本内容.我也将它用于PDF和HTML转换为明文(分别使用pdftotext和lynx).


ra9*_*a9r 9

我知道并喜欢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.)
Run Code Online (Sandbox Code Playgroud)

常用用途:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data
Run Code Online (Sandbox Code Playgroud)

技术:

* 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
Run Code Online (Sandbox Code Playgroud)

三版屏幕刮刀:

* 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.
Run Code Online (Sandbox Code Playgroud)


Gat*_*ler 8

我首先会发现有问题的网站是否提供API服务器或RSS源以访问您需要的数据.


Fra*_*ger 7

使用ShoesHpricot, Scraping 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
Run Code Online (Sandbox Code Playgroud)


dpa*_*lin 7

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


Hen*_*nry 6

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


Mik*_*llo 5

我在 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 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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


Jon*_*old 5

虽然它是为.NET web 测试而设计的,但我一直在使用WatiN框架来实现这个目的。由于它是基于 DOM 的,因此很容易捕获 HTML、文本或图像。最近,我用它将MediaWiki All Pages 命名空间查询中的链接列表转储到 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
Run Code Online (Sandbox Code Playgroud)


Gee*_*key 5

.NET的另一个工具是MhtBuilder


小智 5

也有此解决方案:netty HttpClient