Javascript 正则表达式来提取所有链接和相应的链接文本
我是正则表达式的新手,我正在尝试解决以下两个问题:Javascript 正则表达式来提取所有链接和相应的链接文本,javascript,python,regex,perl,Javascript,Python,Regex,Perl,我是正则表达式的新手,我正在尝试解决以下两个问题: 编写一个正则表达式,从HTML页面中提取所有链接和相应的链接文本。例如,如果要分析: text1 <a href="http://example.com">hello, world</a> text2 text1 text2 并得到结果 http://example.com <tab> hello, world http://example.com 你好,世界 执行相同的操作,但也要处理嵌套的情况
text1 <a href="http://example.com">hello, world</a> text2
text1 text2
http://example.com <tab> hello, world
http://example.com 你好,世界
text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3
text1 text3
(?你好,世界
这对我来说似乎已经足够好了,但我不知道该如何处理第二部分。任何帮助或见解都将不胜感激。如果您要使用类似HTML解析器的方法来解决此问题,只需找到a
元素,使用类似字典的方式访问href
属性和get\te即可xt()
用于获取元素的文本:
In [1]: from bs4 import BeautifulSoup
In [2]: l = [
"""text1 <a href="http://example.com">hello, world</a> text2""",
"""text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3"""
]
In [3]: for s in l:
soup = BeautifulSoup(s, "html.parser")
link = soup.a
print(link["href"] + "\t" + link.get_text())
...:
http://example.com hello, world
http://example.com hello, world
[1]中的:从bs4导入BeautifulSoup
在[2]中:l=[
“text1 text2”,
“”“text1 text3”“”
]
In[3]:对于l中的s:
soup=BeautifulSoup(s,“html.parser”)
链接=汤
打印(链接[“href”]+“\t”+链接。获取文本()
...:
http://example.com 你好,世界
http://example.com 你好,世界
对于正则表达式,有时最好查看不应该捕获的内容,而不是应该捕获的内容。此perl正则表达式应该可靠地捕获简单链接及其相关文本:
#!perl
use strict;
use warnings;
my $sample = q{text1 <a href="http://example.com">hello, world</a> text2};
my ($link, $link_text) = $sample =~ m{<a href="([^"]*)"[^>]*>(.*?)</a>};
print "$link \t $link_text\n";
1;
#!perl
严格使用;
使用警告;
my$sample=q{text1 text2};
my($link,$link_text)=$sample=~m{};
打印“$link\t$link\u text\n”;
1.
这将打印:
http://example.com <tab> hello, world
http://example.com 你好,世界
要分解它正在做的事情:
第一个捕获,([^“]*)
,在href属性中查找0个或更多非双引号的字符。方括号用于列出字符范围,前导克拉告诉正则表达式查找不在此范围内的任何字符
类似地,我使用[^>]*>
查找标记的结束括号,而无需担心标记中可能有哪些其他属性
最后,(.*)
是一个0或更多的非贪婪捕获(用问号表示),仅捕获该链接内的所有文本。如果没有非贪婪指示符,它将所有文本与文档中最后一个结束标记
匹配
希望这能帮助你解决作业的第2部分。:) ReEX在嵌套中是不好的。你应该考虑一个真正的HTML解析器。那么我应该怎么回答这个问题呢?就说PLZ没有HTML解析吗?问题来自哪里?问题2好像是你不使用正则表达式的确切原因。我用ReGEX101.com测试这些,所以我用的是Python语法,但是他们可能想要它。谢谢@PatrickHaugh,我几乎给出了我想要的结果。我对这一点很在行,我真的不知道结果分为第1组和第2组是否重要。