regex - 从 HTML 中的多行中提取 InnerHTML

标签 regex perl

我正在使用 Perl 连接到站点,解析其 HTML 并提取标签之间的innerHTML。在尝试高级概念之前,我会先尝试更简单的概念。

我使用 LWP::UserAgent 向站点发送 HTTP GET 请求并接收我的响应。

我将响应存储在数组中,如下所示:

@res = ($ua->request($req))->content;

编辑:要解析的 HTML:

<div class="new"> this is Line 1 </div>
<div>
      this is Line 2 </div>

现在,我解析 HTTP 响应中的每一行并提取标记之间的文本:

foreach $line(@res)
{
chomp $line;
if($line =~ /<div[^>]*?>(.*)<\/div>/)
{
    $match = $1;
    print OUTPUT $match."\n";
}
}

上述代码片段存在的问题是:

  1. 它仅匹配第一个成功匹配的innerHTML。它不会打印所有成功的匹配。我不知道为什么,循环应该按照我的方式工作。每次成功匹配后,变量 $match 的值应被捕获缓冲区的内容覆盖。

  2. 如果标签跨越多行,它将无法提取innerHTML之间的文本。开始 div 标签位于第一行,innerHTML 位于下一行,结束 div 标签位于下一行。

我无法在这篇文章中编写 HTML,因此给出了描述。

如有任何帮助,我们将不胜感激。

最佳答案

使用强大的 HTML 解析器:

use HTML::TreeBuilder::XPath qw();

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse($http_response->content);

for my $node ($tree->findnodes('//div')) {
    print $_->as_HTML for @{ $node->content_array_ref };
}

关于regex - 从 HTML 中的多行中提取 InnerHTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199909/

相关文章:

javascript - 如何通过正则表达式捕获单词

c# - 用 C# 属性替换 XML 注释的正则表达式

Perl Concat 字符串截断行首

regex - 匹配多行并在Perl正则表达式中打印

perl - 如何临时更改 Perl 使用的 tmp 目录?

regex - 如何将字符串转换为在 Perl 中与其自身匹配的正则表达式?

c# - 正则表达式语法停止搜索

javascript - 快一: What's wrong with this RegEx?

javascript - 如何在javascript中分割断线?

jquery - 从 XML 创建资源数据捕获记录的脚本解决方案