Python获取当前页面内所有链接的四种方法对比分析


Posted in Python onAugust 19, 2017

本文实例讲述了Python获取当前页面内所有链接的四种方法。分享给大家供大家参考,具体如下:

'''
得到当前页面所有连接
'''
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
url = 'http://www.testweb.com'
r = requests.get(url)
r.encoding = 'gb2312'
# 利用 re (太黄太暴力!)
matchs = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" , r.text)
for link in matchs:
  print(link)
print()
# 利用 BeautifulSoup4 (DOM树)
soup = BeautifulSoup(r.text,'lxml')
for a in soup.find_all('a'):
  link = a['href']
  print(link)
print()
# 利用 lxml.etree (XPath)
tree = etree.HTML(r.text)
for link in tree.xpath("//@href"):
  print(link)
print()
# 利用selenium(要开浏览器!)
driver = webdriver.Firefox()
driver.get(url)
for link in driver.find_elements_by_tag_name("a"):
  print(link.get_attribute("href"))
driver.close()

注意:若页面中含有 iframe,则 iframe 内所包含页面的所有标签都无法用以上四种方法获得!!!此时则要:

# 再打开所有iframe查找全部的a标签
for iframe in soup.find_all('iframe'):
  url_ifr = iframe['src'] # 取得当前iframe的src属性值 
  rr = requests.get(url_ifr)
  rr.encoding = 'gb2312'
  soup_ifr = BeautifulSoup(rr.text,'lxml')
  for a in soup_ifr.find_all('a'):
    link = a['href']
    m = re.match(r'http:\/\/.*?(?=\/)',link)
    #print(link)
    if m:
      all_urls.add(m.group(0))
Python 相关文章推荐
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
Python自定义简单图轴简单实例
Jan 08 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
Feb 23 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
python 对xml解析的示例
Feb 27 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
python多线程方法详解
Jan 18 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 #Python
Python正则捕获操作示例
Aug 19 #Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 #Python
在java中如何定义一个抽象属性示例详解
Aug 18 #Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 #Python
python中子类调用父类函数的方法示例
Aug 18 #Python
Python设计实现的计算器功能完整实例
Aug 18 #Python
You might like
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python实现自动重启本程序的方法
2015/07/09 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
Python多项式回归的实现方法
2019/03/11 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
英文求职信写作小建议
2014/02/16 职场文书
公司员工管理制度
2015/08/04 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技