从多个标签中提取innerHTML

时间:2014-10-27 03:35:45

标签: html regex perl text

我有一项任务是使用Perl从html链接中提取内部html文本。

这是一个例子,

<a href="www.stackoverflow.com">Regex Question</a>

我想提取字符串:正则表达式问题

请注意,内部文本可能为空。这个例子得到一个空字符串。

<a href="www.stackoverflow.com"></a>

并且内部文本可能包含多个这样的标签。

<a href="www.stackoverflow.com"><b><h2>Regex Question</h2></b></a>

我曾尝试写一段Perl正则表达式,但没有成功。特别是,我不知道如何处理多个标签。

5 个答案:

答案 0 :(得分:3)

使用HTML Parser解析HTML。

如果您需要从网上下载内容,建议您查看Mojo::DOMMojo::UserAgent

以下内容将使用包含stackoverflow.com的href拉取所有链接,并在其中显示文本:

use strict;
use warnings;

use Mojo::DOM;
use Data::Dump;

my $dom = Mojo::DOM->new(do {local $/; <DATA>});

for my $link ($dom->find('a[href*="stackoverflow.com"]')->each) {
    dd $link->all_text;
}

__DATA__
<html>
<body>
<a href="www.stackoverflow.com">Regex Question</a>
I want to extract the string: Regex Question

<a href="www.notme.com">Don't want this link</a>
Note that, the inner text might be empty like this. This example get an empty string.

<a href="www.stackoverflow.com"></a>
and the inner text might be enclosed with multiple tags like this.

<a href="www.stackoverflow.com"><b><h2>Regex Question with tags</h2></b></a>
</body>
</html>

输出:

"Regex Question"
""
"Regex Question with tags"

要获得有用的8分钟介绍性视频,请查看Mojocast Episode 5

答案 1 :(得分:1)

<a[^>]*>(?:<[^>]*>)*([^<>]*)(?:<[^>]*>)*<\/a>

试试这个。参见demo.Grab捕获或匹配。

http://regex101.com/r/sU3fA2/1

答案 2 :(得分:1)

通过正则表达式解析HTML是一个坏主意,你不是查克诺里斯。您可以使用Mojo::DOM模块,这将使您的任务变得非常简单。

样本:

use Mojo::DOM;

# Parse
my $dom = Mojo::DOM->new('<a href="www.stackoverflow.com"><b><h2>Regex Question</h2></b></a>');

# Find
say $dom->at('a')->text;
say $dom->find('a')->text;

要安装Mojo :: DOM,只需输入以下命令

即可

$ cpan Mojo::DOM

答案 3 :(得分:0)

这样的东西
(?<=>)[^<>\/]*(?=<\/)

将匹配字符串:Regex Question

示例:http://regex101.com/r/sG4bZ1/1

答案 4 :(得分:0)

应该使用html解析器,但可能使用正则表达式 这样就可以找到没有嵌套A标签的A-tag对,也可以是 让其他标签出现在内容中 如果你想要一个没有其他标签的a-tags内容,它会略有不同(未显示)。

由于您使用的是Perl,因此可能会有效。

 # =~ /(?s)<a(?>\s+(?:".*?"|'.*?'|[^>]*?)+>)(?<!\/>)((?:(?!(?><a(?>\s+(?:".*?"|'.*?'|[^>]*?)+>)|<\/a\s*>)).)*)<\/a\s*>/

 (?s)
 <a                            # Begin A-tag, must (should) contain attrib/val's
 (?>
      \s+                      # (?!\s) add this if you think malformed '<a  >' could slip by
      (?: " .*? " | ' .*? ' | [^>]*? )+
      >
 )
 (?<! /> )                     # Lookbehind, Insure this is not a closed A-tag '<a/>'
 (                             # (1 start), Capture Content between open/close A-tags
      (?:                           # Cluster, match content
           (?!                           # Negative assertion
                (?>
                     <a                            # Not Start A-tag
                     (?>
                          \s+  
                          (?: " .*? " | ' .*? ' | [^>]*? )+
                          >
                     )
                  |  </a \s* >                     #  and Not End A-tag
                )
           )
           .                             # Assert passed, consume a content character 
      )*                            # End Cluster, do 0 to many times
 )                             # (1 end)
 </a \s* >                     # End A-tag