HTML抓取的选项?

nodio 发布于 2018-02-25 html 最后更新 2018-02-25 01:08 685 浏览

我正在考虑尝试Beautiful Soup,一个用于HTML抓取的Python包。有没有其他的HTML抓取包我应该看? Python不是必需品,我其实也有兴趣听到其他语言。 迄今为止的故事:

已邀请:

ysequi

赞同来自:

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

ut_sed

赞同来自:

Ruby世界相当于美丽的汤是why_the_lucky_stiff的Hpricot

baut

赞同来自:

正则表达式对于HTML抓取工作也非常好;-)虽然看了美丽的汤后,我可以看到为什么这是一个有价值的工具。

uet

赞同来自:

你可能已经有了,但我认为这是你正在尝试做的事情:

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

wfuga

赞同来自:

对于Perl,有WWW :: Mechanize。

zipsum

赞同来自:

我在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 
它非常完整。这之前的所有内容都是库导入和我的代理的设置。

gquia

赞同来自:

BeautifulSoup是HTML抓取的好方法。我以前的工作让我做了大量的刮擦,我希望当我开始时我知道BeautifulSoup。这就像DOM有更多有用的选择,并且是pythonic更多。如果你想尝试Ruby,他们移植了BeautifulSoup,称它为RubyfulSoup,但它在一段时间内没有更新。 其他有用的工具是HTMLParser或sgmllib.SGMLParser,它们是标准Python库的一部分。这些工作通过调用方法每次你输入/退出标签并遇到HTML文本。他们就像Expat,如果你熟悉的话。如果您要解析非常大的文件并且创建DOM树会很长且昂贵,那么这些库特别有用。 正则表达式不是非常必要的。 BeautifulSoup处理正则表达式,所以如果你需要他们的权力,你可以在那里使用它。我说,除非你需要速度和更小的内存空间,否则可以使用BeautifulSoup。如果您在Python上找到更好的HTML解析器,请告诉我。

dodit

赞同来自:

我发现HTMLSQL是一个非常简单的screenscrape方法。花费几分钟的时间才能得到结果。 查询是非常直观的 - 就像:

SELECT title from img WHERE $class == 'userpic'
现在有一些其他方法采用相同的方法。

vvel

赞同来自:

在.NET世界中,我推荐HTML敏捷包。不像上述某些选项(如HTMLSQL)那么简单,但它非常灵活。它可以让你制作不完整的HTML,就好像它是格式良好的XML一样,所以你可以使用XPATH或者只是在节点上进行迭代。 http://www.codeplex.com/htmlagilitypack

tiure

赞同来自:

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

iid

赞同来自:

使用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

ab_non

赞同来自:

我已经用Python很多美丽的汤。它比正则表达式检查好得多,因为它就像使用DOM一样工作,即使HTML格式不正确。您可以使用比正则表达式更简单的语法快速查找HTML标记和文本。一旦找到一个元素,就可以迭代它和它的子元素,这对于理解代码中的内容比使用正则表达式更有用。我希望多年前的“美丽汤”(The Soup)在我不得不进行大量的屏幕扫描的时候就已经存在 - 它会为我节省很多时间和头痛,因为在人们开始验证之前,HTML结构非常差。

emagni

赞同来自:

在Java中,您可以使用TagSoup

det

赞同来自:

Scrubyt使用Ruby和Hpricot来做好网页抓取。我在大约30分钟的时间内为我的大学图书馆服务人员写了一个刮刀。

xporro

赞同来自:

Perl的另一个选项是Web::Scraper,它基于Ruby的Scrapi。简而言之,使用简洁明了的语法,您可以直接将强大的刮板直接转换为数据结构。

walias

赞同来自:

虽然它是为.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

uqui

赞同来自:

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

gautem

赞同来自:

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

uin

赞同来自:

Python lxml库充当libxml2和libxslt库的Pythonic绑定。我特别喜欢它的XPath支持和漂亮的内存XML结构打印。它也支持解析破碎的HTML。我不认为你可以找到比lxml更快地解析XML的其他Python库/绑定。

funde

赞同来自:

你会傻瓜不使用Perl ..这里来的火焰.. 在以下模块和ginsu上加上任何刮擦。

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

uin

赞同来自:

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

svero

赞同来自:

HTML5 parsing algorithmhtml5lib(Python,Ruby),Validator.nu HTML Parser(Java,JavaScript; C++开发中),Hubbub(C),Twintsam(C#;即将推出)的实现。

lnulla

赞同来自:

使用Aptana的Jaxer + jQuery解析页面也取得了巨大的成功。它本质上并不像脚本那么快,但是jQuery选择器+真正的JavaScript/DOM是更复杂(或畸形)页面的救星。

baut

赞同来自:

另一个.NET工具是MhtBuilder

hquae

赞同来自:

'简单的HTML DOM解析器'是PHP的一个很好的选择,如果你熟悉jQuery或JavaScript选择器,那么你会发现自己在家里。 Find it here There is also a blog post about it here.

svelit

赞同来自:

我知道并喜欢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.

tqui

赞同来自:

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

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

wqui

赞同来自:

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

eearum

赞同来自:

我喜欢Google Spreadsheets的ImportXML(URL,XPath)功能。 如果您的XPath表达式返回多个值,它将在列的下方重复单元格。 一个电子表格中最多可以有50个importxml()功能。 RapidMiner的Web插件也非常易于使用。它可以发布帖子,接受cookie,并可以设置user-agent

enemo

赞同来自:

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

ueum

赞同来自:

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

xet

赞同来自:

SharpQuery 它基本上是C#的jQuery。它依赖于HTML Agility Pack解析HTML。

eearum

赞同来自:

对于那些更喜欢图形化工作流程工具的人来说,RapidMiner(FOSS)具有很好的网络抓取和抓取功能。 以下是一系列视频: http://vancouverdata.blogspot.com/2011/04/rapidminer-web-crawling-rapid-miner-web.html

baut

赞同来自:

我做了很多先进的网页抓取工作,因此希望对我的堆栈有完全的控制权,并理解这些限制。 This webscraping library是结果。

kodit

赞同来自:

这个解决方案也是:netty HttpClient

edolor

赞同来自:

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

verror

赞同来自:

我为网络抓取做了一个很好的库Internet Tools。 我们的想法是将模板与网页进行匹配,网页将从页面中提取所有数据,并验证页面结构是否保持不变。 因此,您可以采取您想要处理的网页的HTML,删除所有动态或不相关的内容并注释有趣的部分。 例如。在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

ad_est

赞同来自:

那么,如果你想从客户端使用浏览器完成jcrawl.com。在从Web应用程序(http://www.jcrawl.com/app.html)设计了废弃服务之后,您只需将生成的脚本添加到HTML页面即可开始使用/显示数据。 所有的报废逻辑都是通过JavaScript在浏览器上发生的。希望对你有帮助。点击此链接查看提取latest news from Yahoo tennis的实例。

ynulla

赞同来自:

当从服务器端的HTML文档中提取数据时,Node.js是一个很好的选择。我已成功使用了两个称为requestcheerio的模块。 你可以看到一个例子here