天道酬勤,学无止境

perl html 解析库/工具(perl html parsing lib/tool)

问题

是否有一些用于 perl 的强大工具/库,例如 BeautifulSoup 到 python?

谢谢

回答1

HTML::TreeBuilder::XPath 对于大多数问题来说是一个不错的解决方案。

回答2

我从未使用过 BeautifulSoup,但从快速浏览它的文档来看,您可能需要 HTML::TreeBuilder。 它甚至可以很好地处理损坏的文档,并允许遍历已解析的树或查询项 - 查看 HTML::Element 中的look_down方法。

如果您喜欢/了解 XPath,请参阅 daxim 的推荐。 如果您喜欢通过 CSS 选择器选择项目,请查看 Web::Scraper 或 Mojo::DOM。

回答3

当您正在寻找强大的功能时,您可以使用 XML::LibXML 来解析 HTML。 这样做的好处是您拥有 Perl 可用于处理文档的最快和最好的 XML 工具链(MSXML 除外,它仅适用于 MS)的所有功能,包括 XPath 和 XSLT(如果您使用另一个,则需要重新解析)解析器比 XML::LibXML)。

use strict;
use warnings;
use XML::LibXML;
# In 1.70, the recover and suppress_warnings options won't shup up the
# warnings. Hence, a workaround is needed to keep the messages away from
# the screen.
sub shutup_stderr {
    my( $subref, $bufref ) = @_;
    open my $fhbuf, '>', $bufref;
    local *STDERR = $fhbuf;
    $subref->(); # execute code that needs to be shut up
    return;
}
# ==== main ============================================================
my $url = shift || 'http://www.google.de';
my $parser = XML::LibXML->new( recover => 2 ); # suppress_warnings => 1
# Note that "recover" and "suppress_warnings" might not work - see above.
# https://rt.cpan.org/Public/Bug/Display.html?id=58024
my $dom; # receive document
shutup_stderr
    sub { $dom = $parser->load_html( location => $url ) }, # code
    \my $errmsg; # buffer
# Now process document as XML.
my @nodes = $dom->getElementsByLocalName( 'title' );
printf "Document title: %s\n", $_->textContent for @nodes;
printf "Lenght of error messages: %u\n", length $errmsg;
print '-' x 72, "\n";
print $dom->toString( 1 );

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • perl html parsing lib/tool
    Is there some powerful tools/libs for perl like BeautifulSoup to python? Thanks
  • 如何从Shell执行XPath单行代码?(How to execute XPath one-liners from shell?)
    问题 是否有针对Ubuntu和/或CentOS的软件包,该软件包具有可以执行XPath单一代码的命令行工具,如foo //element@attribute filename.xml或foo //element@attribute < filename.xml并逐行返回结果? 我正在寻找可以让我apt-get install foo或yum install foo然后可以直接使用的方法,不需要包装程序或其他适应方法。 以下是一些即将发生的事情的示例: 能吉里如果我编写此包装器,则可以按上述方式调用该包装器: #!/usr/bin/ruby require 'nokogiri' Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row| puts row end XML :: XPath。 可以与此包装一起使用: #!/usr/bin/perl use strict; use warnings; use XML::XPath; my $root = XML::XPath->new(ioref => 'STDIN'); for my $node ($root->find($ARGV[0])->get_nodelist) { print($node->getData, "\n"); } 来自XML :: XPath的xpath返回太多噪声, --
  • 在 Perl 或 Python 中模拟类似 lex 的功能(Emulation of lex like functionality in Perl or Python)
    问题 这是交易。 有没有办法根据多个正则表达式在一行中标记字符串? 一个例子: 我必须根据不同的正则表达式获取所有 href 标签、它们对应的文本和其他一些文本。 所以我有 3 个表达式,并希望标记该行并提取与每个表达式匹配的文本标记。 我实际上已经使用 flex(不要与 Adob​​e 混淆)完成了这项工作,这是一个很好的旧 lex 的实现。 lex 通过执行基于表达式的“动作”提供了一种优雅的方式来做到这一点。 也可以控制 lex 读取文件的方式(基于块/行的读取)。 问题是 flex 实际上产生了 C/C++ 代码,它实际上完成了标记化工作。 我有一个包含所有这些东西的 make 文件。 我想知道 perl /python 是否可以以某种方式做同样的事情。 只是我想用一种编程语言本身做我喜欢的一切。 作为我的应用程序的一部分,标记化只是我想要做的事情之一。 除了 perl 或 python 之外,任何语言(功能性的)都可以做到这一点吗? 我确实在这里阅读了 PLY 和 ANTLR(解析,我可以在哪里了解它)。 但是有没有办法在python本身中自然地做到这一点? 请原谅我的无知,但这些工具是否用于任何流行的产品/服务? 谢谢你。 回答1 在 CPAN 上查看以下模块的文档 HTML::TreeBuilder HTML::TableExtract 和 解析
  • 动态抓取和解析 [关闭](Dynamic scraping and parsing [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 6年前关闭。 改进这个问题 原问题改写: 我知道很多 PHP、Js、CSS、OOP,最近通过使用 vim 编辑器的 netrw 和 elinks 插件来下载一系列经过解析并准备上传到的网页(大约一百万行),从而磨练了我的正则表达式技能我的网站。 我在一个 linux/ubuntu 系统上工作,一个本地主机设置,这个特定的项目正在实现 Concrete5 cms - 它是用 PHP 编写的。 看到抓取和解析信息的好处,我想让我的网站动态地执行这个功能,尽管规模要小得多; 例如,使我的新用户能够将他们的个人信息从另一个网站传输到我的网站——这通常是在安全连接(尽管并非总是如此)和密码下。 问题:为此使用的最佳工具(脚本语言)是什么? 我不知道 Perl 或 Ruby,但我相信其中任何一个都是不错的选择。 我也听说过 AWK 和 SED。 一旦我开始学习这门语言,我相信我可以弄清楚如何去做。 我真的很感激一些有经验的人就哪种语言最适合开始投入时间学习它的意见。 谢谢你的帮助。 回答1 我强烈推荐 Ruby 和 Capybara 进行网络抓取。 (请参阅水豚页面底部的非测试相关示例)。 原因: 简单、简短的抓取语法
  • 您可以提供解析HTML的示例吗?(Can you provide examples of parsing HTML?)
    问题 您如何使用各种语言和库来解析HTML? 回答时: 个别评论将链接到有关如何使用正则表达式解析HTML的问题的答案,以显示正确的处理方式。 为了保持一致性,我要求示例为锚标记中的href解析HTML文件。 为了便于搜索此问题,请您遵循以下格式 语言:[语言名称] 图书馆:[图书馆名称] [example code] 请使库成为库文档的链接。 如果您要提供除提取链接以外的示例,还请包括: 目的:[解析做什么] 回答1 语言:JavaScript 库:jQuery $.each($('a[href]'), function(){ console.debug(this.href); }); (使用firebug console.debug输出...) 并加载任何html页面: $.get('http://stackoverflow.com/', function(page){ $(page).find('a[href]').each(function(){ console.debug(this.href); }); }); 为此使用了另一个函数,链接方法时我认为它更干净。 回答2 语言:C# 库:HtmlAgilityPack class Program { static void Main(string[] args) { var web = new HtmlWeb(); var
  • C#中的Web浏览-库,工具等-Perl中的诸如Mechanize之类的东西? [关闭](WebBrowsing in C# - Libraries, Tools etc. - Anything like Mechanize in Perl? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 寻找类似于.NET的Mechanize ... 如果您不知道什么是机械化。.http://search.cpan.org/dist/WWW-Mechanize/ 我将在此处保留建议列表。 用于浏览/发布/屏幕抓取的任何内容(WebRequest和WebBrowser控件除外)。 解析中 HTMLAgilityPack-http://www.codeplex.com/htmlagilitypack 网络应用测试 WatiN-Web应用程序测试框架(.NET)-http://watin.sourceforge.net/ 硒-http://seleniumhq.org/ 测试设计画布的艺术-花费金钱 工具 Firefox的Firebug IE的Internet Explorer开发人员工具栏 Chrome也有一个 笔记 WatiN与我正在寻找的东西很接近,只是它打开了一个浏览器,同时又很烦人。 取决于您在做什么。 回答1 我一直在使用WatiN产生巨大的效果。 这是一种简单的方法:1)使用IE自动执行用户输入,以及2)浏览DOM。 回答2 您可以使用WebBrowser控件,该控件可以在某种程度上实现自动化。 回答3
  • 在命令行上解析 HTML; 如何捕获文本 ?(Parsing HTML on the command line; How to capture text in <strong></strong>?)
    问题 我正在尝试从 HTML 输出中获取如下所示的数据: <strong>Target1NoSpaces</strong><span class="creator"> .... <strong>Target2 With Spaces</strong><span class="creator"> .... 我正在使用管道列车将数据减少到我试图击中的目标。 到目前为止,这是我的方法: grep "/strong" output.html | awk '{print $1}' Grep "/strong" 以获取目标行; 这工作正常。 管道到'awk'{print $1}'。 当目标没有空格时,这在 #1 情况下有效,但在目标有空格时在 #2 情况下失败......只保留第一个单词,如下所示: <strong>Target1NoSpaces</strong><span <strong>Target2 无论是在我的 awk 中还是在不同的命令中,您是否有任何正确击中目标的提示? 任何快速和肮脏的(grep、awk、sed、perl)都会受到赞赏。 回答1 在 grep 中使用 Perl 正则表达式的后视和前瞻功能。 它应该比使用 awk 更简单。 grep -oP "(?<=<strong>).*?(?=</strong>)" file 输出: Target1NoSpaces
  • 该怎么做正则表达式模式在字符串中的任何地方都不匹配?(What to do Regular expression pattern doesn't match anywhere in string?)
    问题 我正在尝试使用以下模式匹配<input>类型的“ hidden”字段: /<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/ 这是样本表单数据: <input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" /> 但是我不确定type , name和value属性是否总是以相同的顺序出现。 如果type属性排在最后,则匹配将失败,因为在我的模式中,匹配是从头开始的。
  • 是否有用于解析apache配置文件的python库?(Any python libs for parsing apache config files?)
    问题 是否有任何用于解析apache配置文件的python库,或者如果不是,则有人用其他语言(perl,php,java,c#)意识到这一点吗? 因为我将能够用python重写它们。 回答1 我确实在这里找到了一个有趣的python的Apache Config解析器:http://www.poldylicious.de/node/25 提到的Apache Config解析器未记录,但确实有效。 回答2 红帽的新兴技术小组拥有Augeas(用C编写,但提供Python绑定),这是一个通用的系统配置工具,带有“镜头”,用于读取和写入几种不同的配置文件格式。 我会考虑调查适用于Apache的镜头的可用性。 回答3 截至2016年,有一个使用pyparsing编写的新库: https://pypi.python.org/pypi/parse_apache_configs/ 有一些粗糙的边缘,但允许我添加指令并保存到新文件。 来源https://github.com/alextricity25/parse_apache_configs 回答4 我不知道没有Python库,但是这是一个perl库:http://packages.debian.org/sid/libapache-configfile-perl Package: libapache-configfile-perl Priority
  • 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 中的 Grep 和提取数据(Grep and Extract Data in Perl)
    问题 我将 HTML 内容存储在一个变量中。 如何提取在页面中一组常见标记之间找到的数据? 例如,我对数据感兴趣(由DATA表示保存在一组标记之间,一行一行: ... <td class="jumlah">*DATA_1*</td> <td class="ud"><a href="">*DATA_2*</a></td> ... 然后我想在哈希中存储映射 DATA_2 => DATA_1 回答1 因为它是 HTML,所以您可能希望使用 XPath 模块来处理 HTML,HTML::TreeBuilder::XPath。 首先,您需要使用 HTML::TreeBuilder 方法解析您的字符串。 假设您网页的内容位于名为$content的变量中,请执行以下操作: my $tree = HTML::TreeBuilder->new; $tree->parse_file($file_name); 现在您可以使用 XPath 表达式在您关心的节点上获取迭代器。 第一个表达式获取html元素中body table中tr中的所有td节点: my $tdNodes = $tree->findnodes('/html/body/table/tr/td'); 最后,您可以遍历循环中的所有节点以找到您想要的: foreach my $node ($tdNodes->get_nodelist) { my
  • 在 Perl 中解析复杂的 XML(Parsing complex XML in Perl)
    问题 我有一个 XML,我想打印他的所有节点,我想访问电影节点字段。 我可以访问 Name 和 City,但无法访问 Movie 字段。 <OnlineCinema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Cinema.xsd"> <Cinema> <City>Cluj</City> <Name>Cinema2</Name> <MovieName>ScaryMovie</MovieName> <Movie> <Name>ScaryMovie</Name> <Genre>comedie</Genre> <Director>lala</Director> <Writer>asdf</Writer> <Cast>asdvvb</Cast> <Year>2010</Year> <Trailer>http://www.youtube.com/embed/RMDZ8M47j0I</Trailer> <NRLoc>400</NRLoc> </Movie> </Cinema> 代码: use XML::Simple; use Data::Dumper; $xml = new XML::Simple (KeyAttr=>[]); $data = $xml->XMLin(
  • 在Python中使用lxml解析具有错误标头的文本文件(Use lxml to parse text file with bad header in Python)
    问题 我想用lxml的etree解析文本文件(存储在本地)。 但是我所有的文件(数千个)都有标头,例如: -----BEGIN PRIVACY-ENHANCED MESSAGE----- Proc-Type: 2001,MIC-CLEAR Originator-Name: webmaster@www.sec.gov Originator-Key-Asymmetric: MFgwCgYEVQgBAQICAf8DSgAwRwJAW2sNKK9AVtBzYZmr6aGjlWyK3XmZv3dTINen TWSM7vrzLADbmYQaionwg5sDW3P6oaM5D3tdezXMm7z1T+B+twIDAQAB MIC-Info: RSA-MD5,RSA, AHxm/u6lqdt8X6gebNqy9afC2kLXg+GVIOlG/Vrrw/dTCPGwM15+hT6AZMfDSvFZ YVPEaPjyiqB4rV/GS2lj6A== <SEC-DOCUMENT>0001193125-07-200376.txt : 20070913 <SEC-HEADER>0001193125-07-200376.hdr.sgml : 20070913 <ACCEPTANCE-DATETIME>20070913115715 ACCESSION NUMBER: 0001193125-07-200376
  • Perl中的HTML解析(HTML parsing in perl)
    问题 我正在尝试在perl中解析以下HTML结构。 我需要选择所有包含类消息和id的dd元素。 我希望脚本执行的所有操作是遍历所有dd元素并打印出dd元素的id,但是它需要忽略第一个dd元素,因为这是静态的并且不会改变。 只要可以从cpan安装它,它就可以与任何perl模块一起使用,以使其对我来说很容易。 我在perl和解析html方面没有太多经验,因此任何指针都将非常有帮助。 谢谢 :) HTML结构: <pre><code> <html> <head> </head> <body> .....other elements <div id="messages"> <div class="header"></div> <dl> <dd class="message unread mc-friend mc-message">This is just a random message, do not parse</dd> <dd id="msg2" class="message unread mc-message"> Hello </div> <dd id="msg3" class="message unread mc-message"> Hello </dd> </dl> </div> </body> </html> </pre></code> 回答1 这样的事情,快速而简单: #
  • Perl 解析 HTML 表格中的链接(Perl parse links from HTML Table)
    问题 我正在尝试从 HTML 表格中获取链接。 通过使用 HTML::TableExtract,我能够解析表格并获取文本(即下面示例中的能力、异常),但无法获取表格中涉及的链接。 例如, <table id="AlphabetTable"> <tr> <td> <a href="/cate/A/Ability">Ability</a> <span class="count">2650</span> </td> <td> <a href="/cate/A/Abnormal">Abnormal</a> <span class="count">26</span> </td> </table> 有没有办法使用 HTML::TableExtract 获取链接? 或其他可能在这种情况下使用的模块。 谢谢 我的代码的一部分: $mech->get($link->url()); $te->parse($mech->content); foreach $ts ($te->tables){ foreach $row ($ts->rows){ print @$row[0]; #it only prints text part #but I want its link } } 回答1 HTML::LinkExtor,将提取的表格文本传递给它的解析方法。 my $le = HTML::LinkExtor-
  • 使用 Perl 解析 html(Parse html using Perl)
    问题 我有以下 HTML- <div> <strong>Date: </strong> 19 July 2011 </div> 我一直在使用 HTML::TreeBuilder 来解析使用标签或类的 html 的特定部分,但是上述 html 使我难以仅提取日期。 例如我试过- for ( $tree->look_down( '_tag' => 'div')) { my $date = $_->look_down( '_tag' => 'strong' )->as_trimmed_text; 但这似乎与<strong>.的早期使用相冲突<strong>. 我只想解析“2011 年 7 月 19 日”。 我已经阅读了关于 TreeBuilder 的文档,但找不到这样做的方法。 如何使用 TreeBuilder 执行此操作? 回答1 “转储”方法对于找到绕过 HTML::TreeBuilder 对象的方法非常有用。 此处的解决方案是获取您感兴趣的元素的父元素(在本例中为 <div>)并遍历其内容列表。 您感兴趣的文本将是纯文本节点,即列表中不引用 HTML::Element 对象的元素。 #!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new;
  • 使用 Perl 解析 html(Parse html using Perl)
    问题 我有以下 html- <a href="http://address.com">John</a>: I really <b>love</b> <b>soccer</b>; 我想将它解析成一个 csv 姓名 = 约翰 评论 = 我真的很喜欢足球。 关键词=爱,足球 在控制台应用程序中,非常感谢任何帮助。 回答1 CPAN 上有很多 HTML 解析器,我的首选是 HTML::TreeBuilder::XPath Text::CSV 将帮助您从提取的数据中生成 CSV。 回答2 以下是如何使用 HTML::TreeBuilder 进行解析的示例: use HTML::TreeBuilder; my $html = HTML::TreeBuilder->new_from_content(<<END_HTML); <a href="http://address.com">John</a>: I really <b>love</b> <b>soccer</b>; END_HTML my $name = $html->find('a')->as_text; # "John" my @keywords = map { $_->as_text } $html->find('b'); # "love", "soccer" my $comment = $html->as_text; # "John
  • Perl - 如何抓取目录,解析目录中的每个文件并将所有注释提取到 html 文件(Perl - How to crawl a directory, parse every file in the directory and extract all comments to html file)
    问题 我需要一些认真的帮助,我是 perl 的新手,需要关于如何创建 perl 脚本的帮助,该脚本会提示用户输入包含 perl 文件的目录,解析该目录中的每个文件,然后将每个文件中的所有注释提取到个人html 文件。 已经这样做的代码示例或现有模块会很棒。 谢谢! 回答1 PPI 可用于解析 Perl 代码文件。 这应该让您开始在目录中获取 Perl 文件(假设它们具有.pl扩展名)并获取注释。 我不确定你对 HTML 片段的意思: use warnings; use strict; use PPI; my $dir = shift; for my $file (glob "$dir/*.pl") { my $doc = PPI::Document->new($file); for my $com (@{ $doc->find('PPI::Token::Comment') }) { print $com->{content}; } } 更新:看看 HTML::Template (但它可能是矫枉过正)。 回答2 使用关键字“dir”进行简单的 cpan 搜索会找到一大堆有用的模块。 我经常使用的其中之一是: 我 :: 目录 回答3 如果你有选择,这里有一个 Ruby 脚本 #!/usr/bin/env ruby print "Enter directory: " directory
  • 使用Shell解析HTML(Parse HTML using shell)
    问题 我有一个包含大量数据的HTML,我感兴趣的部分是: <tr valign=top> <td><b>Total</b></td> <td align=right><b>54</b></td> <td align=right><b>1</b></td> <td align=right>0 (0/0)</td> <td align=right><b>0</b></td> </tr> 我尝试使用awk ,现在是: awk -F "</*b>|</td>" '/<[b]>.*[0-9]/ {print $1, $2, $3 }' "index.html" 但是我想要的是: 54 1 0 0 现在我得到: '<td align=right> 54' '<td align=right> 1' '<td align=right> 0' 有什么建议么? 回答1 awk -F '[<>]' '/<td / { gsub(/<b>/, ""); sub(/ .*/, "", $3); print $3 } ' file 输出: 54 1 0 0 其他: awk -F '[<>]' ' /<td><b>Total<\/b><\/td>/ { while (getline > 0 && /<td /) { gsub(/<b>/, ""); sub(/ .*/, "", $3) print $3 }
  • 如何在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