使用perl正则表达式解析HTML

pgky5nke  于 2023-06-23  发布在  Perl
关注(0)|答案(5)|浏览(140)

我创建了一个Perl脚本,它将使用在线网站在用户输入散列后破解MD5散列。我是部分成功的,因为我能够从网站得到响应,虽然我需要解析HTML和显示散列,并以明文向用户相应的密码。下面是我现在得到的输出片段:

<strong>21232f297a57a5a743894a0e4a801fc3</strong>: admin</p>

使用regex buddy,我能够使用下面的表达式**[a-z 0 -9]{32}**来单独匹配哈希部分。我需要以下格式的最终输出:

21232f297a57a5a743894a0e4a801fc3: admin

任何帮助将不胜感激。谢谢你!

t9aqgxwy

t9aqgxwy1#

我认为使用HTML::Parser来简单/可靠地解析HTML会更好。否则,您将陷入用regexp解析HTML的噩梦,并且您会发现它并不可靠。

mwyxok5s

mwyxok5s2#

在CPAN上有一些工具可以为您处理获取和解析页面。其中一个是Web::Scraper。告诉它要获取哪个页面以及需要哪些节点(使用xpath或CSS语法),它将为您获取这些节点。我不会给予一个例子,因为我不知道你的网址。
有一个很好的blogpost about this on blogs.perl.org by stas,它使用了一个不同的模块,这可能也很有帮助。

vptzau2j

vptzau2j3#

十年后,我们有了更复杂、更简单的解决方案。
如果您可以编写CSS selector,就可以轻松地提取响应的各个部分,而无需处理HTML::Parser和其他方法的复杂性。Mojo::UserAgent为您提供了一切:

use v5.16;

# This is a real URL just for this answer
my $url = 'https://gist.githubusercontent.com/briandfoy/85033496f93e860cdf53f45ba931e8f7/raw/a0876e090fc5a3c1b75ff2a19580f731b784828d/selector_example.html';

use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;

my $tx = $ua->get($url);
my $hash = $tx->res->dom->at( 'div p strong' )->text;  # or whatever selector

say $hash;

at只查找与选择器匹配的第一个节点。如果有多个节点,则使用find。您可以将匹配作为一个“集合”获取,并在map中以相同的方式转换它们:

my $hashes = $tx->res->dom->find( 'div p strong' )
    ->map( sub {$_->text} )
    ->join("\n");

特定的选择器div p strong取决于返回的HTML,如果有idclass值,则更容易确定元素。我在Mojo Web Useragents中广泛地讨论了这些。

oxiaedzo

oxiaedzo4#

这就是:

$str = q{<strong>21232f297a57a5a743894a0e4a801fc3</strong>: admin</p>};
@arr = $str =~ m{<strong>(.+)</strong>(.+)</p>};
print(join("", @arr), "\n");
nxowjjhe

nxowjjhe5#

因此,在Perl中可靠地做到这一点是可能的,因为Perl的正则表达式有一种扩展格式,其复杂性足以解析HMTL(实际上,你可以将Perl代码嵌入到正则表达式中,而在Perl代码中,更重要的是,你可以使用递归正则表达式来解析HTML)。但是,你真的不想这样做。如果你决定这样做,请阅读advanced Perl regular expressions,这样你就知道你正在进入什么。
这里的实际问题是,可靠地解析HTML之类的东西是一个巨大的过程,使用朴素的正则表达式实现来完成这一任务非常诱人。因为regex是一种常规语言(在Perl之外),因此不能解析常规语言以外的任何语言。Perl是不同的,添加了递归正则表达式等东西使这成为可能,但非常困难,容易出错,而且很复杂。此外,实际上,您可能只能支持HTML的一种变体。
HTML::Parser在一个C,XS模块中完成主要的工作,该模块可以利用已有的C库。这意味着,重要的是不要为自己维护一个巨大的噩梦般的代码库。

相关问题