天道酬勤,学无止境

WWW::机械化提取帮助 - PERL(WWW::Mechanize Extraction Help - PERL)

问题

我正在尝试自动提取在网站上找到的成绩单。 由于站点在描述列表中格式化了采访,因此可以在 dl 标签之间找到整个成绩单。 下面的脚本允许我搜索站点并以纯文本格式提取文本,但我实际上正在寻找它来包含 dl 标记之间的所有内容,意思是 dd、dt 等。这将允许我们为面试开发我们自己的 CSS。

关于该页面需要注意的是,在采访过程中的不同点插入了中断语句。 我们发现的一些使用配对从网页中提取信息的工具发现这是一个问题,因为它只抓取信息直到 break 语句。 如果您指出我的不同方向,请记住一些事情。 这是我到目前为止所拥有的。

#!/usr/bin/perl -w

use strict;
use WWW::Mechanize;
use WWW::Mechanize::TreeBuilder;

my $mech = WWW::Mechanize->new();
WWW::Mechanize::TreeBuilder->meta->apply($mech);
$mech->get("http://millercenter.org/president/clinton/oralhistory/madeleine-k-albright");

# find all <dl> tags
my @list = $mech->find('dl');

foreach ( @list ) {
print $_->as_text();
}

如果有一种工具可以基本上打印我拥有的内容,只是这次是 HTML,请告诉我!

回答1

您的代码很好,只需将as_text()方法更改为as_HTML() ,它就会显示包含 HTML 标签的内容。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • WWW::Mechanize Extraction Help - PERL
    I'm try to automate the extraction of a transcript found on a website. The entire transcript is found between dl tags since the site formatted the interview in a description list. The script I have below allows me to search the site and extract the text in a plain-text format, but I'm actually looking for it to include everything between the dl tags, meaning dd's, dt's, etc. This will allow us to develop our own CSS for the interview. Something to note about the page is that there are break statements inserted at various points during the interview. Some tools we've found that extract
  • Perl Mechanize : 获取页面修改后的响应页面?(Perl Mechanize : Get the response page after the page is modified?)
    问题 我正在尝试检索使用 js 和数据库加载的页面。 加载大约需要 2 到 3 分钟。 我能够获得显示“请等待 2 到 3 分钟以加载页面”的页面。 但无法在加载后检索页面。 我已经尝试了以下方法: 1.) 在机械化中使用镜像方法。 但是响应内容没有被解码。 因此该文件是胡言乱语。 (还尝试编写与镜像方法类似的方法,该方法可以解码响应内容,但也不起作用。未加载新内容。) 2.) 尝试添加请求标头“if-modified-since”。 但时间还是一样,新的内容没有被获取。 任何指示或建议都会非常有帮助。 TIA :) 回答1 它不适用于 Mechanize 本身,您需要先检查 javascript 对页面做了什么,以及数据来自何处。 然后,2 种可能性: 在加载之前获取数据后,您可以在 perl 中模拟 javascript,并从 javascript 下载新数据的位置。 查看数据是否经过某种程度的编码,然后使用 perl 对其进行解码。 您使用 Mech Firefox,那么您无需关心 javascript,因为它将由 Firefox 处理。 如果您不想看到它,您可以隐藏该应用程序。 例子 : use WWW::Mechanize::Firefox; use HTML::TreeBuilder::LibXML; my $mech = WWW::Mechanize::Firefox
  • 如何在Perl中从HTML提取URL和链接文本?(How can I extract URL and link text from HTML in Perl?)
    问题 我之前曾问过如何在Groovy中做到这一点。 但是,由于所有CPAN库,现在我要在Perl中重写我的应用程序。 如果页面包含以下链接: <a href="http://www.google.com">Google</a> <a href="http://www.apple.com">Apple</a> 输出为: Google, http://www.google.com Apple, http://www.apple.com 在Perl中执行此操作的最佳方法是什么? 回答1 请查看使用WWW :: Mechanize模块来实现此目的。 它将为您获取您的网页,然后为您提供易于使用的URL列表。 my $mech = WWW::Mechanize->new(); $mech->get( $some_url ); my @links = $mech->links(); for my $link ( @links ) { printf "%s, %s\n", $link->text, $link->url; } 非常简单,如果您要导航到该页面上的其他URL,则更加简单。 机械基本上是对象中的浏览器。 回答2 看一下HTML :: LinkExtractor和HTML :: LinkExtor,它们是HTML :: Parser包的一部分。 HTML
  • 如何完全镜像网页?(How do I completely mirror a web page?)
    问题 我在几个不同的网站上有几个网页,我想完全镜像它们。 这意味着我将需要图像、CSS 等,并且需要转换链接。 此功能类似于使用 Firefox 来“将页面另存为”并选择“网页,完成”。 我想将文件和相应的目录命名为合理的名称(例如 myfavpage1.html,myfavpage1.dir)。 我无权访问服务器,它们也不是我的页面。 这是一个示例链接:点击我! 再澄清一点……我有大约 100 个页面要镜像(许多来自慢速服务器),我将在 Solaris 10 上进行这项工作,并每小时将结果转储到 samba 挂载供人们查看。 而且,是的,我显然已经尝试过 wget 与几个不同的标志,但我还没有得到我正在寻找的结果。 因此,指向 GNU wget 页面并不是很有帮助。 让我从一个简单的例子开始。 wget --mirror -w 2 -p --html-extension --tries=3 -k -P stackperl.html "https://stackoverflow.com/tags/perl" 从这里,如果我的标志正确,我应该在 stackper.html 文件中看到 https://stackoverflow.com/tags/perl 页面。 回答1 如果您只想运行命令并获取网站的副本,请使用其他人推荐的工具,例如 wget、curl 或某些 GUI 工具。
  • 机械化Java(mechanize for Java)
    问题 我想知道是否有类似于 Perl/Python 的 Java 机械化。 谢谢! 回答1 看看 HtmlUnit。 它类似于 Perl 的 WWW::Mechanize。 还有一个名为 WWW::HtmlUnit 的 Perl 版本(它使用 Inline::Java 向 Perl 公开 Java 库的方法)。 回答2 是的,现在有了! 我也想用 Java 进行机械化,我们已经编写了它。 请查看 http://gistlabs.com/software/mechanize-for-java/(以及此处的 GitHub https://github.com/GistLabs/mechanize)。 欢迎反馈、错误报告和成功案例!! 回答3 您是否在考虑通用 Web 客户端,例如 HttpClient?
  • WWW::Mechanize::Timed https 超时不起作用(WWW::Mechanize::Timed https timeout does not work)
    问题 所以我已经研究到互联网的尽头(至少我是这么认为的)关于这个问题。 我正在尝试为get()设置 60 秒的alarm超时,但它不会被捕获,并且会运行超过 60 秒,并且在 www::mechanized:: 达到默认超时(180 秒)时也是如此:定时构造函数,我收到以下错误: 在 /usr/lib/perl5/site_perl/5.10.0/WWW/Mechanize/Timed.pm 第 52 行中使用除 (+) 之外的未初始化值。 代码: use WWW::Mechanize::Timed; use HTTP::Cookies; use Try::Tiny; my $ua = WWW::Mechanize::Timed->new( autocheck => 0#turning off autocheck becuase any get errors will be fatal need to check ourselves ); my $cookies = HTTP::Cookies->new( autosave => 1 ); $ua->cookie_jar($cookies); $ua->agent_alias("Windows IE 6"); try{ local $SIG{ALRM} = sub { die "alarm\n" }; alarm 60; $ua-
  • HTML抓取的选项? [关闭](Options for HTML scraping? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 我正在考虑尝试Beautiful Soup,这是用于HTML抓取的Python包。 还有其他我应该查看的HTML抓包工具吗? 不需要Python,实际上我也很想了解其他语言。 到目前为止的故事: Python 美丽的汤 xml文件 HTQL cra草机械化红宝石能吉里杏子机械化 scrAPI scrubyt! 袋熊瓦蒂尔 。网 HTML敏捷包瓦丁佩尔 WWW ::机械化网页抓取工具爪哇标签汤 HtmlUnit 网络收割 [jARVEST] 21 so Jericho HTML解析器的JavaScript 要求啦啦队阿图节点马幻影的PHP [古特] 29 htmlSQL PHP简单HTML DOM解析器使用CURL进行PHP爬取猩红查询走 goquery 数据流套件他们大多数屏幕刮板 回答1 在Ruby世界中,相当于Beautiful Soup的是Why_the_lucky_stiff的Hpricot。 回答2 在.NET世界中,我建议使用HTML Agility Pack。 虽然不如上述某些选项(例如HTMLSQL)那么简单,但是它非常灵活。 它使您可以处理格式不正确的HTML,就像处理格式正确的XML一样
  • 是否有与Perl的LWP / WWW :: Mechanize等效的.NET?(Is there a .NET equivalent of Perl's LWP / WWW::Mechanize?)
    问题 在使用.NET的HttpWebRequest / Response对象之后,我宁愿自己开枪,也不愿使用它来爬网网站。 我正在寻找一个可以获取URL的现有.NET库,并使您能够跟踪链接,提取/填写/提交页面上的表单等。Perl的LWP和WWW::Mechanize模块可以很好地做到这一点,但是我正在处理一个.NET项目。 我遇到了HTML Agility Pack,它看起来很棒,但是它缺乏模拟链接/表单的功能。 这样的工具已经存在了吗? 回答1 有人构建了一些代码来作为HTML Agility Pack(我也很喜欢)的附件运行,它使您可以进行一些形式上的修改: http://apps.ultravioletconsulting.com/projects/uvcwebtransform/docs/class_html_agility_pack_1_1_add_ons_1_1_form_processor_1_1_form_processor.html 我读过一篇评论,说它不是WWW :: Mechanize,但这是一个很好的开始。 提供了代码,因此您可以轻松地对其进行扩展。
  • WWW::Mechanize::Firefox - 如何打开多个标签(WWW::Mechanize::Firefox - How to open multiple tabs)
    问题 我想打开两个单独的选项卡并在 Firefox 中保持打开状态。 我正在使用WWW::Mechanize::Firefox 。 请在下面找到代码: #!/usr/bin/perl -w use strict; use WWW::Mechanize::Firefox; my @array = <DATA>; foreach (@array) { my $mech = WWW::Mechanize::Firefox->new( activate => 1, # bring the tab to the foreground autoclose => 0 # to prevent autoclosing of the Tab ); $mech->get($_); } __DATA__ www.google.com www.yahoo.com 上面的代码工作正常并创建了两个选项卡。 但是我对我的方法不满意,因为我正在创建两个对象。 我正在寻找某种方法来打开多个选项卡。 我无法使用单个$mech对象来完成,因此使用 for 循环创建了多个对象。 我已经浏览了以下文档: WWW::机械化::火狐 火狐::应用程序 WWW::机械化::插件::显示 WWW::Mechanize::Firefox::Cookbook 然而,他们似乎都没有回答这个问题。 或者我可能遗漏了这些文档中的一些信息。
  • 是否有与Perl的WWW :: Mechanize等效的PHP?(Is there a PHP equivalent of Perl's WWW::Mechanize?)
    问题 我正在寻找具有与Perl的WWW :: Mechanize类似的功能的库,但适用于PHP。 基本上,它应该允许我使用简单的语法提交HTTP GET和POST请求,然后解析结果页面,并以简单的格式返回所有表单及其字段以及页面上的所有链接。 我知道CURL,但它有点太准了,语法也很丑陋(大量curl_foo($curl_handle, ...)语句 澄清: 我想要比到目前为止的答案更高级的内容。 例如,在Perl中,您可以执行以下操作: # navigate to the main page $mech->get( 'http://www.somesite.com/' ); # follow a link that contains the text 'download this' $mech->follow_link( text_regex => qr/download this/i ); # submit a POST form, to log into the site $mech->submit_form( with_fields => { username => 'mungo', password => 'lost-and-alone', } ); # save the results as a file $mech->save_content('somefile
  • 如何使用Perl从JavaScript动态生成的网页中获取文本?(How can I use Perl to grab text from a web page that is dynamically generated with JavaScript?)
    问题 我正在尝试从Perl中提取一个网站,但是我需要使用的页面是使用javascript生成的,因此您在源代码中看到的是: <div id="results"></div> 我需要以某种方式提取该div的内容,然后使用Perl / proxies / whatever将其保存到文件中。 例如,我要保存的信息将是 document.getElementById('results').innerHTML; 我不确定这是否可行,或者是否有人有任何想法或方法来做到这一点。 我在其他页面上使用了lynx源转储,但是由于我无法直接将屏幕抓取到该页面,因此我来这里询问有关信息! 如果有人感兴趣,则该页面为http://downloadcenter.trendmicro.com/index.php?clk=left_nav&clkval=pattern_file&regs=NABU,我要获取的信息是有关ConsumerOPR的行 回答1 您将需要对JavaScript所做的事情进行逆向工程。 它会触发AJAX请求填充<div>吗? 如果是这样,使用Firebug嗅探请求,然后使用LWP :: UserAgent或WWW :: Mechanize复制请求信息应该很容易。 如果Javascript仅在执行纯DOM操作,则意味着数据必须存在于页面中的其他位置或Javascript已经存在。 因此
  • Perl WWW::Mechanize 方法在 AIX 中不起作用(Perl WWW::Mechanize methods not working in AIX)
    问题 我有一个简单的屏幕抓取网页(基于简单 URL 的报告)的要求,并将 HTML 响应定向到输出文件。 但是,该 URL 将重定向到具有“基于表单”身份验证(无 javascript)的身份验证(HTTPS 登录)页面,并且在身份验证后,我尝试查看的报告应显示在$response (作为 HTML)中。 有趣的是,我的代码在 Windows 机器上工作得很好,但是下面的相同代码在 AIX 机器上不起作用,看起来click_button()函数调用什么也不做。 我试过click() , submit() ,但没有一个工作,所以我得到的不是实际报告,而是 HTML 输出文件中的登录屏幕。 任何想法,可能有什么问题? use WWW::Mechanize; use strict; my $username = "admin"; my $password = "welcome1"; my $outpath = "/home/data/output"; my $fromday = 7; my $url = "https://www.myreports.com/tax_report.php"; my $name = "tax_report"; my $outfile = "$outpath/$name.html"; my $mech = WWW::Mechanize->new(noproxy
  • 如何使用 WWW::Mechanize 或任何 Perl 模块下载文件?(How can I download a file using WWW::Mechanize or any Perl module?)
    问题 在 WWW::Mechanize 或任何 Perl 模块中有没有办法在访问网站后读取文件。 例如,我单击了一个按钮'Receive' ,将出现一个包含消息的文件 (.txt)。 我如何才能阅读内容? 非常感谢答案。我已经为此工作了好几天,而且,我尝试了所有的可能性。 任何人都可以帮忙吗? 如果你能给我一个想法吗? :) 这是我的代码的一部分: ... my $username = "admin";<br> my $password = "12345";<br> my $url = "http://...do_gsm_sms.cgi"; my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, agent_alias =>$login_agent, cookie_jar => $cookie_jar); $mech->credentials($username, $password);<br> $mech->get($url); $mech->success() or die "Can't fetch the Requested page";<br> print "OK! \n"; #This works <br> $mech->form_number(1); $mech->click() ; 之后,将出现“下载
  • 使用 Perl 抓取网站(using Perl to scrape a website)
    问题 我有兴趣编写一个转到以下链接并提取数字 1975 的 perl 脚本:https://familysearch.org/search/collection/results#count=20&query=%2Bevent_place_level_1%3ACalifornia%20%2Bevent_place_level_2%3A%22San %20Diego%22%20%2Bbirth_year%3A1923-1923~%20%2Bgender%3AM%20%2Brace%3AWhite&collection_id=2000219 该网站是 1923 年出生于 1940 年居住在加利福尼亚州圣地亚哥县的白人男性人数。我试图在循环结构中进行此操作,以概括多个县和出生年份。 在locations.txt 文件中,我放置了县列表,例如圣地亚哥县。 当前代码运行,但不是#1975,而是显示未知。 数字 1975 应该在 $val\n 中。 我非常感谢任何帮助! #!/usr/bin/perl use strict; use LWP::Simple; open(L, "locations26.txt"); my $url = 'https://familysearch.org/search/collection/results#count=20&query=%2Bevent_place
  • 在Perl中获取重定向的URL(Get redirected url in perl)
    问题 我想获取最后一个重定向URL。 喜欢 url_1:http://on.fb.me/4VGeu url_2:https://www.facebook.com/ 我想在perl中通过url_1获得url_2。 先前的资料如下。 sub get_redirect_location { my ($url) = @_; my $ua = LWP::UserAgent->new; $ua->proxy('http', 'SAMPLE_PROXY'); my $req = new HTTP::Request(GET => $url); my $res = $ua->request($req); return $res->headers_as_string; } 提前致谢。 回答1 您可以使用查找找到导致响应的请求 $response->request() 您可以使用以下方法获得链中的上一个响应 $response->previous() 全部一起: while ($response) { say $response->request()->uri(); $response = $response->previous(); } 回答2 您可以看一下WWW :: Mechanize。 我以前用它来做这样的事情。 http://search.cpan.org/~jesse/WWW
  • How can I download a file using WWW::Mechanize or any Perl module?
    Is there a way in WWW::Mechanize or any Perl module to read on a file after accessing a website. For example, I clicked a button 'Receive', and a file (.txt) will appear containing a message. How will I be able to read the content? Answers are very much appreciated.. I've been working on this for days,, Also, I tried all the possibilities. Can anyone help? If you can give me an idea please? :) Here is a part of my code: ... my $username = "admin";<br> my $password = "12345";<br> my $url = "http://...do_gsm_sms.cgi"; my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, agent_alias =>
  • 如何在Perl Web搜寻器中处理Javascript?(How can I handle Javascript in a Perl web crawler?)
    问题 我想抓取一个网站,问题在于,它充满了JavaScript内容,例如按钮,当按下按钮时,它们不会更改URL,但是页面上的数据已更改。 通常,我使用LWP / Mechanize等爬网网站,但都不支持JavaScript。 任何想法? 回答1 另一个选项可能是带有WWW :: Selenium模块的Selenium 回答2 WWW :: Scripter模块具有一个可能有用的JavaScript插件。 但是不能说我自己使用过它。 回答3 WWW :: Mechanize :: Firefox可能有用。 这样,您可以让Firefox处理复杂的JavaScript问题,然后提取结果html。 回答4 我建议使用HtmlUnit和Perl包装器:WWW :: HtmlUnit。
  • Perl WWW::Mechanize -- 获取 URL 的身份验证错误(Perl WWW::Mechanize -- Authentication Error GETing URL)
    问题 我正在尝试使用 Perl 的 Mechanize 库填写 Web 表单。 每当我在搜索框中输入 URL 时,它都会提示以下消息,我可以手动登录成功。 但是,当我运行以下脚本时,出现以下错误: 如何使用$mech对象正确填写第一个身份验证框凭据? my $mech = WWW::Mechanize->new( 'keepalive' => 1 ); my $url = "http://URL/I/NEED/TO/ACCESS"; my $username = "username"; my $password = "password"; $mech->credentials($username, $password); $mech->get($url); <----------------- ERROR (LINE 93) 编辑: 以下是在请求的站点上运行wget的结果 --2013-08-30 11:16:17-- http://moss.micron.com/MFG/ProbeTest/Lists/Manufacturing%20Requests/AllItems.aspx Resolving moss.micron.com... 137.201.88.118 Connecting to moss.micron.com|137.201.88.118|:80
  • Perl WWW::Mechanize methods not working in AIX
    I have a simple requirement of screen scraping a web-page (simple URL based reports) and direct the HTML response to an output file. The URL will however redirect to an authentication (HTTPS Login) page with "form based" authentication (no javascript) and upon authentication the report I am trying to view should show up in the $response (as HTML). Interestingly, my code is working just fine in a Windows machine, however the same code below is not working in AIX machine and it looks like the click_button() function call does nothing. I have tried click(), submit(), but none is working so
  • 如何使用Perl抓取一个使用JavaScript揭示其内容的网站?(How can I use Perl to scrape a website that reveals its content with JavaScript?)
    问题 我需要编写一个Perl脚本来抓取网站。 该网站只能使用JavaScript进行抓取,并且用户使用的是Windows。 我在装有IE6的工作机上使用Win32 :: IE :: Mechanize有了某种方式,但是后来我转到了装有IE8的上网本,甚至无法获取一个简单的页面。 Win32 :: IE :: Mechanize是否与IE的最新版本保持同步? 但是,更重要的是,对于最近使用WinXP的计算机,刮取仅通过JavaScript揭示其内容的网站的最快,最简单的方法是什么? 回答1 WWW :: Selenium。 它允许您指定要使用的浏览器(一开始就支持IE和Firefox) 它支持通过xpath元素,表ID,文本(正则表达式匹配!)和URL访问元素它提供了用户交互选项的瑞士军刀,使您可以灵活地模拟最终用户的浏览 您需要下载Selenium Remote Control并使其在后台运行,模块才能正常工作。 如果您的网页加载时间无法预测,则可能不是一个好的选择。 回答2 看看Win32 :: Watir。 这是一个较新的模块,显式支持IE 6、7和8。 回答3 我看不到WWW :: Mechanize的任何提法,因此为了完整起见,我将其提及。 硒也变得非常流行,可以在许多测试场景中使用。 回答4 WWW :: Scripter及其:: Plugin