一组用来提取HTML文档中元素内容的工具集,它能够理解HTML和CSS选择器以及XPath表达式。

语法

  1. use URI;
  2. use Web::Scraper;
  3.  
  4. # First, create your scraper block
  5. my $tweets = scraper {
  6. # Parse all LIs with the class "status", store them into a resulting
  7. # array 'tweets'. We embed another scraper for each tweet.
  8. process "li.status", "tweets[]" => scraper {
  9. # And, in that array, pull in the elementy with the class
  10. # "entry-content", "entry-date" and the link
  11. process ".entry-content", body => 'TEXT';
  12. process ".entry-date", when => 'TEXT';
  13. process 'a[rel="bookmark"]', link => '@href';
  14. };
  15. };
  16.  
  17. my $res = $tweets->scrape( URI->new("http://twitter.com/miyagawa") );
  18.  
  19. # The result has the populated tweets array
  20. for my $tweet (@{$res->{tweets}}) {
  21. print "$tweet->{body} $tweet->{when} (link: $tweet->{link})\n";
  22. }

process

  1. scraper {
  2. process "tag.class", key => 'TEXT';
  3. process '//tag[contains(@foo, "bar")]', key2 => '@attr';
  4. process '//comment()', 'comments[]' => 'TEXT';
  5. };

如果你传入的参数是URI或HTTP response,那Web::Scaper自动去寻找Content-Type header和META标签以判断文件编码。否则你压根先把HTML内容解码为Unicode后再传给scape函数。

  1. $res = $scraper->scrape(URI->new($uri));
  2. $res = $scraper->scrape($html_content);
  3. $res = $scraper->scrape(\$html_content);
  4. $res = $scraper->scrape($http_response);
  5. $res = $scraper->scrape($html_element);

当你把HTML内容作为参数传给scrape函数时,你还要考虑一个问题:HTML文档中出现 相对路径怎么办?所以这个时候你可以把base url一并作为参数传进去。

  1. res= scraper->scrape($html_content, "http://example.com/foo");

它有两个参数,当第一个参数以"//"或"id("开头时作为XPath对待;否则作为HTML或CSS选择器对待。

  1. # <span class="date">2008/12/21</span>
  2. # date => "2008/12/21"
  3. process ".date", date => 'TEXT';
  4.  
  5. # <div class="body"><a href="http://example.com/">foo</a></div>
  6. # link => URI->new("http://example.com/")
  7. process ".body > a", link => '@href';
  8.  
  9. # <div class="body"><!-- HTML Comment here --><a href="http://example.com/">foo</a></div>
  10. # comment => " HTML Comment here "
  11. #
  12. # NOTES: A comment nodes are accessed when installed
  13. # the HTML::TreeBuilder::XPath (version >= 0.14) and/or
  14. # the HTML::TreeBuilder::LibXML (version >= 0.13)
  15. process "//div[contains(@class, 'body')]/comment()", comment => 'TEXT';
  16.  
  17. # <div class="body"><a href="http://example.com/">foo</a></div>
  18. # link => URI->new("http://example.com/"), text => "foo"
  19. process ".body > a", link => '@href', text => 'TEXT';
  20.  
  21. # <ul><li>foo</li><li>bar</li></ul>
  22. # list => [ "foo", "bar" ]
  23. process "li", "list[]" => "TEXT";
  24.  
  25. # <ul><li id="1">foo</li><li id="2">bar</li></ul>
  26. # list => [ { id => "1", text => "foo" }, { id => "2", text => "bar" } ];
  27. process "li", "list[]" => { id => '@id', text => "TEXT" };

Web::Scraper 页面提取分析的更多相关文章

  1. web scraper 抓取分页数据和二级页面内容

    如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...

  2. 简易数据分析 13 | Web Scraper 抓取二级页面

    这是简易数据分析系列的第 13 篇文章. 不知不觉,web scraper 系列教程我已经写了 10 篇了,这 10 篇内容,基本上覆盖了 Web Scraper 大部分功能.今天的内容算这个系列的最 ...

  3. web scraper无法解决爬虫问题?通通可以交给python!

    今天一位粉丝的需求所涉及的问题值得和大家分享分享~~~ 背景问题 是这样的,他看了公号里的关于web scraper的系列文章后,希望用它来爬取一个网站搜索关键词后的文章标题和链接,如下图 按照教程, ...

  4. 使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

    web scraper 下载:Web-Scraper_v0.2.0.10 使用 Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬 ...

  5. 简易数据分析 02 | Web Scraper 的下载与安装

    这是简易数据分析系列的第 2 篇文章. 上篇说了数据分析在生活中的重要性,从这篇开始,我们就要进入分析的实战内容了.数据分析数据分析,没有数据怎么分析?所以我们首先要学会采集数据. 我调研了很多采集数 ...

  6. web scraper 抓取数据并做简单数据分析

    其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标 ...

  7. 简易数据分析 12 | Web Scraper 翻页——抓取分页器翻页的网页

    这是简易数据分析系列的第 12 篇文章. 前面几篇文章我们介绍了 Web Scraper 应对各种翻页的解决方法,比如说修改网页链接加载数据.点击"更多按钮"加载数据和下拉自动加载 ...

  8. Web Scraper 翻页——利用 Link 选择器翻页 | 简易数据分析 14

    这是简易数据分析系列的第 14 篇文章. 今天我们还来聊聊 Web Scraper 翻页的技巧. 这次的更新是受一位读者启发的,他当时想用 Web scraper 爬取一个分页器分页的网页,却发现我之 ...

  9. tiny web服务器源码分析

    tiny web服务器源码分析 正如csapp书中所记,在短短250行代码中,它结合了许多我们已经学习到的思想,如进程控制,unix I/O,套接字接口和HTTP.虽然它缺乏一个实际服务器所具备的功能 ...

随机推荐

  1. 两个月淘宝刷单,连续死N次血泪史 (转)

    两个月淘宝刷单,连续死N次血泪史 派代网 2014/10/13 刷单 分享到:3 [思路网注] 看来是靠刷流量刷销量是行不通了,点击率与展现无法匹配,这是致命的!!那么,贵就贵点,直通车来吧!!再删宝 ...

  2. Mac 系统显示和隐藏文件的方法

    1. 代码法: 显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defau ...

  3. JavaScript XML 兼容处理,序列化和反序列化以及回调事件

    浏览器中XML DOM的支持 IE中通过ActiveXObject实现了XML的支持,存在一下几个版本:Microsoft.XmlDom,MSXML2.DOMDocument,MSXML2.DOMDo ...

  4. 【转】VS2013编译libjpeg库

    原文地址:http://blog.csdn.net/weixinhum/article/details/42718959 现在,很多图像处理工具和开源库都给出了图像解码的函数接口,然而有时这些接口并不 ...

  5. C#执行带参数的Oracle存储过程

    public void UpdateByRowGuid(string RowGuid) { //OracleConnection conn = new OracleConnection("d ...

  6. 不同车型 不同起步价不同费用的问题(switch语句)

    #include "stdio.h" #include "math.h" main() { int a; float meet,b; printf(" ...

  7. [kuangbin带你飞]专题十 匹配问题 二分图多重匹配

    二分图的多重匹配问题不同于普通的最大匹配中的"每个点只能有最多一条边" 而是"每个点连接的边数不超过自己的限定数量" 最大匹配所解决的问题一般是"每个 ...

  8. for循环++i效率

    偶然用到for循环 注意查看了一下 ++i的速度更快 这是PHP语言独有的 其他语言不会有这种情况

  9. 关于封装unity3d的dll时候的进一步总结

    在进行新项目的开发或者接手.后期维护其他一些项目时,经常性的,我们会遇到以下情况: 1.使用新的插件替换已有的bug比较多或者不在维护的插件: 2.因策划需求或美术资源的变更,而不得不更换游戏中的游戏 ...

  10. hdoj Last non-zero Digit in N! 【数论】

    找规律! 求N!最后非0位的值.比方2是120的最后一个不是0的值. 输入N比較大,要大数保存. 注意到最后0的个数是与5的因数的个数相等.设f(n)为n!的最后非0位. 那么f(n)=((n%5)! ...