我有一项任务是使用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正则表达式,但没有成功。特别是,我不知道如何处理多个标签。
答案 0 :(得分:3)
使用HTML Parser解析HTML。
如果您需要从网上下载内容,建议您查看Mojo::DOM
和Mojo::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)
答案 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)
答案 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