我正在使用 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";
}
}
上述代码片段存在的问题是:
它仅匹配第一个成功匹配的innerHTML。它不会打印所有成功的匹配。我不知道为什么,循环应该按照我的方式工作。每次成功匹配后,变量 $match 的值应被捕获缓冲区的内容覆盖。
如果标签跨越多行,它将无法提取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/