正则表达式提取网页源码的url链接

网页源码单行:
</title><link rel="shortcut icon" href="/_layouts/15/Canway.Portal.External.Web/images/favicon.png" type="image/vnd.microsoft.icon" id="favicon"><link rel="stylesheet" type="text/css" href="/_layouts/15/2052/styles/Themable/corev15.css?rev=OjbVZfNOSp9SHxHy9FUrXw%3D%3D"><link rel="shortcut icon" href="/gday!!!!!!!!!!!!!!!!!!!!!!/_layouts/15/Canway.Portal.External.Web/images/.png" type="image/vnd.microsoft.icon" id="favicon">

现在要实现正则表达式提取其中的三个链接
1:/_layouts/15/Canway.Portal.External.Web/images/favicon.png
2:/_layouts/15/2052/styles/Themable/corev15.css?rev=OjbVZfNOSp9SHxHy9FUrXw%3D%3D
3:/gday!!!!!!!!!!!!!!!!!!!!!!/_layouts/15/Canway.Portal.External.Web/images/.png

用python的re模块不能返回所有的结果,只会返回匹配到的最后一个,请问一下用什么方式可以?

阅读 7.9k
4 个回答

您好,方法有很多,re模块和xpath等等一大把。当然您说re模块不行,我就用re模块举个栗子:
先定义您的网页源码:

a='您的网页源码'

接下来是定义re模块的抓取规则,这里可以用到compile贪婪匹配:

pattern = re.compile('</title><link rel="shortcut icon" href=(.*?)type.*?href=(.*?)><link rel=.*? href=(.*?) type=.*?'',re.I)

注意最后加上re.I,用于忽略大小写(当然这里不加也可以),接下来是读取抓取的数据:
定义一个空list:

items = re.findall(pattern,a)
pageStories = []

然后通过for遍历读出来:

for item in items:
    pageStories.append([item[0].strip(),item[1].strip(),item[2].strip()])
print  pageStories

最后上图,证明我说的是真的:
图片描述

哈哈最近刚了解了正则,拿来试了试。
javasCript代码如下:

var raw = '</title><link rel="shortcut icon" href="/_layouts/15/Canway.Portal.External.Web/images/favicon.png" type="image/vnd.microsoft.icon" id="favicon"><link rel="stylesheet" type="text/css" href="/_layouts/15/2052/styles/Themable/corev15.css?rev=OjbVZfNOSp9SHxHy9FUrXw%3D%3D"><link rel="shortcut icon" href="/gday!!!!!!!!!!!!!!!!!!!!!!/_layouts/15/Canway.Portal.External.Web/images/.png" type="image/vnd.microsoft.icon" id="favicon">';
var linkReg = /href="[^"]*"/g;

function findMatch(reg, raw) {
  var data = {}
  var arr = []
  while(true) {
    data = reg.exec(raw);
    if (data!= null) {
      let pos1 = data[0].indexOf('"');
      let pos2 = data[0].lastIndexOf('"');
      let item = data[0].slice(pos1 + 1, pos2)
      arr.push(item);
      console.log(item);
    } else {
      break;
    }
  }
  return arr;
}

findMatch(linkReg, raw);

正则一般就是找共性,你这就是需要href引号里面的内容,所以就
/href="S+"/g
出来后,还需要删去href与引号
不过我感觉另一个答案更适合你

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题