【问题标题】:Extract specific elements from an array从数组中提取特定元素
【发布时间】:2013-07-05 00:53:19
【问题描述】:

我有一个元素数组,它们基本上是 HTML 标签。下面是一个例子

<L>
 <LI>
  <LI_Label>Label1</LI_Label>
  <LI_Title>Title1</LI_Title>  
 </LI>
  <LI>
  <LI_Label>Label2</LI_Label>
  <LI_Title>Title2</LI_Title>  
 </LI>
 <LI>
  <LI_Label>Label3</LI_Label>
  <LI_Title>Title3</LI_Title>  
 </LI>
</L>

我试图仅提取 LI_Title 元素并将它们存储到一个单独的数组中,然后我想将其连接成 1 个完整的字符串。对于提取和存储,我使用以下脚本。但是,当我打印数组时,整个 HTML 块都在 Found_LI 数组中,而不仅仅是 LI_Title 元素,正如我所期望的那样。希望这里有人能指出我在下面做错了什么?

foreach (@po_siblings)
{
    if ($_ =~ /LI_Title/)
    {
        push(@found_LI,$_);
    }
}
print "@found_LI\n";

【问题讨论】:

  • 问题是@po_siblings 不包含您认为的内容。你认为它是一个每行一个元素的数组,但它的元素实际上比这更大。 (也许甚至整个事情都只是一个元素?)
  • 最简单的解决方法是将整个if 语句替换为push @found_LI, m/&lt;LI_Title&gt;.*?&lt;\/LI_Title&gt;/g 之类的内容。
  • @raukh:非常感谢。那行得通。

标签: perl


【解决方案1】:

由于您的示例“html”实际上是格式良好的 XML — 为什么不使用 XML 解析器并使用 XPath 查询来查找节点和值?这是使用 XML::LibXML 解决问题的示例脚本:

use strict;
use XML::LibXML;

my $blob = <<'EOF';
<L>
 <LI>
  <LI_Label>Label1</LI_Label>
  <LI_Title>Title1</LI_Title>  
 </LI>
  <LI>
  <LI_Label>Label2</LI_Label>
  <LI_Title>Title2</LI_Title>  
 </LI>
 <LI>
  <LI_Label>Label3</LI_Label>
  <LI_Title>Title3</LI_Title>  
 </LI>
</L>
EOF

my $p = XML::LibXML->new;
my $doc = $p->parse_string($blob);
print join(" ", map { $_->textContent } $doc->findnodes('/L/LI/LI_Title')), "\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多