首页 文章

HTML抓取的选项? [关闭]

提问于
浏览
385

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

到目前为止的故事:

30 回答

  • 7

    来自Adrian Holovaty(Django成名)的templatemaker实用程序使用了一种非常有趣的方法:您可以将相同页面的变体提供给它"learns",其中"holes"为变量数据 . 它's not HTML specific, so it would be good for scraping any other plaintext content as well. I'也用于PDF和HTML转换为明文(分别用pdftotext和lynx) .

  • 57

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

  • 11

    Ruby世界's equivalent to Beautiful Soup is why_the_lucky_stiff' s Hpricot .

  • 7

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

    http://www.codeplex.com/htmlagilitypack

  • 3

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

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

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

  • 3

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

    查询非常直观 - 如:

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

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

  • 3

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

  • 10

    对于Perl,有WWW :: Mechanize .

  • 5

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

    Find it here

    There is also a blog post about it here.

  • 4

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

  • 3

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

    • mechanize:类似于perl WWW:Mechanize . 为您提供类似浏览器的浏览器以便与网页进行混合

    • lxml:Python绑定到 libwww . 支持遍历和选择元素的各种选项(例如XPath和CSS选择)

    • scrapemark:使用模板从HTML中提取信息的高级库 .

    • pyquery:允许您对XML文档进行类似jQuery的查询 .

    • scrapy:高级抓取和网络抓取框架 . 它可用于编写蜘蛛,数据挖掘以及监控和自动化测试

  • 6

    我知道并且爱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.
    
  • 2

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

  • 15

    使用ShoesHpricot时,刮擦堆栈溢出尤其容易 .

    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
    
  • 4

    在Java中我用HtmlUnit取得了一些成功 . 它's a simple framework for writing unit tests on web UI',但对于HTML抓取同样有用 .

  • 2

    .NET的另一个工具是MhtBuilder

  • 4

    也有这个解决方案:netty HttpClient

  • 2

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

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

  • 5

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

  • 33

    虽然它是为.NET网页测试而设计的,但我一直在使用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
    
  • 18

    HTML5 parsing algorithm的实现:html5lib(Python,Ruby),Validator.nu HTML Parser(Java,JavaScript; C in development),Hubbub(C),Twintsam(C#;即将发布) .

  • 39

    你不会使用Perl是个傻瓜..这里来了火焰..

    将以下模块和ginsu砸到任何地方 .

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

    我在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,所以我可能会这样做 .

  • 4

    在Java中,您可以使用TagSoup .

  • 4

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

    所有报废逻辑都通过JavaScript在浏览器上发生 . 希望对你有帮助 . 单击此链接以获取提取latest news from Yahoo tennis的实例 .

  • 16

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

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

    我使用SgmlReader在.NET中得到了不同的结果,最初由Chris Lovett启动,并且似乎已由MindTouch更新 .

  • 11

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

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

    一个电子表格中最多可以包含50个 importxml() 函数 .

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

  • 9

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

相关问题