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

到目前为止的故事:

===============>>#1 票数:63 已采纳

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

===============>>#2 票数:43

在.NET世界中,我建议使用HTML Agility Pack。 附近没有那么简单,上面的一些选项(如HTMLSQL),但它是非常灵活的。 它使您可以像处理格式正确的XML一样处理格式不正确的HTML,因此您可以使用XPATH或仅在节点上进行迭代。

http://www.codeplex.com/htmlagilitypack

===============>>#3 票数:36

BeautifulSoup是HTML抓取的好方法。 我以前的工作是让我做很多工作,我希望我刚开始时就了解BeautifulSoup。 就像DOM有很多有用的选项一样,并且还有很多pythonic。 如果您想尝试使用Ruby,他们会移植BeautifulSoup并将其命名为RubyfulSoup,但是它已经有一段时间没有更新了。

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

正则表达式不是非常必要。 BeautifulSoup处理正则表达式,因此,如果需要它们的强大功能,可以在这里使用它。 我说与BeautifulSoup一起使用,除非您需要速度和较小的内存占用。 如果您在Python上找到了更好的HTML解析器,请告诉我。

===============>>#4 票数:20

我发现HTMLSQL是一种非常简单的屏幕抓取方法。 从字面上看,花费数分钟即可获得结果。

查询是超直观的,例如:

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

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

===============>>#5 票数:18

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

===============>>#6 票数:17

对于Perl,有WWW :: Mechanize。

===============>>#7 票数:14

Python除了Beatiful Soup之外,还有多种HTML抓取选项。 这里是其他一些:

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

===============>>#8 票数:13

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

在这里找到

这里也有关于它的博客文章。

===============>>#9 票数:13

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

===============>>#10 票数:10

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

===============>>#11 票数:9

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

===============>>#12 票数:8

我首先要确定所涉及的站点是否提供API服务器或RSS Feed,以访问所需的数据。

===============>>#13 票数:7

鞋子Hpricot尤其容易消除堆栈溢出。

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 票数:7

Perl的另一个选择是基于Ruby的Scrapi的 Web :: Scraper 简而言之,使用优美而简洁的语法,您可以将健壮的抓取工具直接放入数据结构中。

===============>>#15 票数:6

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

===============>>#17 票数:5

.NET的另一个工具是MhtBuilder

===============>>#18 票数:5

也有此解决方案: netty HttpClient

===============>>#19 票数:4

我在Python上经常使用Beautiful Soup。 它比正则表达式检查要好得多,因为即使HTML格式不正确,它也可以像使用DOM一样工作。 您可以使用比正则表达式更简单的语法快速找到HTML标签和文本。 一旦找到一个元素,就可以遍历该元素及其子元素,这对于理解代码中的内容比使用正则表达式更为有用。 我希望“美丽的汤”存在于多年前,当时我不得不做很多屏幕截图工作-因为HTML结构在人们开始对其进行验证之前太差了,它将为我节省很多时间和头痛。

===============>>#20 票数:4

尽管它是为.NET Web测试而设计的,但我一直为此目的而使用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 票数: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 

差不多完成了。 在此之前的所有操作都是库导入和我的代理的设置。

===============>>#22 票数:3

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

所有抓取逻辑都是通过JavaScript在浏览器上发生的。 希望对你有帮助。 单击此链接以获取从Yahoo网球中提取最新新闻的实时示例。

===============>>#23 票数:3

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

LWP(libwww-perl的缩写)可让您连接到网站并抓取HTML, 您可以在此处获取模块,而O'Reilly的书似乎在此处

TreeBuilder允许您从HTML构造树,并且HTML :: TreeBuilder-Parser提供了建立HTML语法树的文档和源代码

但是,与这种方法相比,可能还有很多繁重的工作要做。 我没有看另一个答案建议的“ 机械化”模块 ,所以我很可能会这样做。

===============>>#24 票数:3

HTML5解析算法的实现html5lib (Python,Ruby), Validator.nu HTML解析器 (Java,JavaScript;开发中的C ++), Hubbub (C), Twintsam (C#;即将推出)。

===============>>#25 票数:3

在Java中,您可以使用TagSoup

===============>>#26 票数:3

如果不使用Perl,您将是个傻瓜。

加固以下模块,然后将人参刮伤。

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

===============>>#27 票数: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")

===============>>#28 票数:2

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

===============>>#29 票数:2

我在SNET中使用SgmlReader产生了不同的结果,它最初是由Chris Lovett启动的,似乎已经由MindTouch更新了。

===============>>#30 票数:2

我喜欢Google Spreadsheets的ImportXML(URL,XPath)函数。

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

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

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

  ask by community wiki translate from so

未解决问题?本站智能推荐: