参考:http://www.freebuf.com/news/special/96763.html

相关资料:http://www.jb51.net/article/65287.htm

1、Python3 win7安装BeautifulSoup

BeautifulSoup中文文档:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html

BeautifulSoup下载:http://www.crummy.com/software/BeautifulSoup/

解压,运行cmd执行:python setup.py install即可

2、导入beatifulsoup库 :from bs4 import BeautifulSoup

传入数据,建立对象: soup = BeautifulSoup(data),

操作soup,完成需求解析。

3、示例代码:

  1. from bs4 import BeautifulSoup
  2. from urllib import request
  3. import re
  4.  
  5. web = request.urlopen('http://www.freebuf.com')
  6. # 没有特别指明解析器,bs4使用了它认为最好的解析器,但是在不同的环境下运行,可能解析器是不一样的。
  7. # 如果没有'html.parser',会有warning提示,表明了bs4的自动选择解析器来解析的特性。
  8. soup = BeautifulSoup(web.read(),'html.parser')
  9. tags_a = soup.find_all(name='a', attrs={'href': re.compile('^https?://')})
  10.  
  11. for tag_a in tags_a:
  12. print(tag_a['href'])

4、利用BeautifulSoup获取网站的sitemap:

  1. # coding:utf-8
  2. # 获取整个网站的sitemap
  3.  
  4. import urllib.request
  5. import urllib.error
  6. from urllib.parse import urlparse
  7. from bs4 import BeautifulSoup
  8. import time
  9. import datetime
  10.  
  11. url = input('请输入扫描的url:')
  12. domain = input('请输入包含的域名:')
  13. sites = set()
  14.  
  15. # 获取一个页面的所有url
  16. def get_local_pages(url, domain):
  17. pages = set()
  18. global sites
  19. repeat_time = 0
  20.  
  21. # 解析传入的url为后面相对路径拼接用
  22. parse_url = urlparse(url)
  23.  
  24. # 防止url读取卡住:自动重读5次
  25. while True:
  26. try:
  27. print('Ready to Open the web!')
  28. time.sleep(1)
  29. print('Opening the web : %s' % url)
  30. web = urllib.request.urlopen(url=url, timeout=20)
  31. print('Success to Open the web!')
  32. break
  33. except urllib.error.URLError as e:
  34. print('Open Url Error:',e)
  35. print('Open url Failed!!!Repeat!')
  36. time.sleep(1)
  37. repeat_time += 1
  38. if repeat_time == 5:
  39. return
  40.  
  41. soup = BeautifulSoup(web.read())
  42. tags = soup.find_all(name='a')
  43.  
  44. for tag in tags:
  45. # 避免参数传递异常
  46. try:
  47. ret = tag['href']
  48. except:
  49. print('Maybe not the attr : href')
  50. continue
  51.  
  52. parse_page = urlparse(ret)
  53.  
  54. # 1 url不为空(协议,域名,路径)
  55. if parse_page[0] is '' and parse_page[1] is '' and parse_page[2] is '':
  56. print('Bad Page(协议\域名\路径均为空):%s' % ret)
  57. continue
  58.  
  59. # 2 协议不为空,判断合法性
  60. if parse_page[0] is not '' and 'http' not in parse_page[0]:
  61. print('Bad Page(协议不合法,非http):%s' % ret)
  62. continue
  63.  
  64. # 3 域名不为空,domain要包含在域名中
  65. if parse_page[1] is not '' and domain not in parse_page[1]:
  66. print('Bad Page(域名不合法,非%s):%s' % (domain, ret))
  67. continue
  68.  
  69. # 4 协议为空,域名不为空(拼接ret),例如://caipiao.taobao.com
  70. if parse_page[0] is '' and parse_page[1] is not '':
  71. print('Fix page(仅域名存在): %s' % ret)
  72. newpage = parse_url[0] + ':' + ret
  73. if newpage not in sites:
  74. print('Add Fix Page(拼接域名):%s' % newpage)
  75. pages.add(newpage)
  76. continue
  77.  
  78. # 5 协议域名为空,路径不为空(拼接ret)
  79. if parse_page[0] is '' and parse_page[1] is '':
  80. print('Fix page(仅路径存在): %s' % ret)
  81. temp_page = parse_url[0] + '://' + parse_url[1] + '/' + ret
  82. # 保持URL的干净
  83. newpage = temp_page[:8] + temp_page[8:].replace('//', '/')
  84. if newpage not in sites:
  85. print('Add Fix Page(拼接路径):%s' % newpage)
  86. pages.add(newpage)
  87. continue
  88.  
  89. # 整理输出
  90. newpage = ret
  91. if newpage not in sites:
  92. print('Add New Page:%s' % newpage)
  93. pages.add(newpage)
  94.  
  95. return pages
  96.  
  97. # dfs 算法遍历全站(目前中小型网站可用,待完善)
  98. def dfs(pages, domain):
  99. global sites
  100. if pages in sites:
  101. return 'Success!'
  102.  
  103. # visited = set()
  104. # sites = set.union(sites,pages)
  105. for page in pages:
  106. if page not in sites:
  107. sites.add(page)
  108. get_pages = get_local_pages(page, domain)
  109. dfs(get_pages, domain)
  110. return
  111.  
  112. t1 = datetime.datetime.now()
  113. pages = get_local_pages(url, domain)
  114. dfs(pages,domain)
  115. text_name = domain + '全站扫描.txt'
  116. with open(text_name, 'a') as f:
  117. f.write('\n' + str(datetime.datetime.now()) + '\n')
  118. for i in sites:
  119. with open(text_name, 'a') as f:
  120. f.write(i + '\n')
  121.  
  122. with open(text_name, 'a') as f:
  123. f.write('\n用时:' + str(datetime.datetime.now() - t1) + '\n')
  124.  
  125. sitemap

sitemap

5、基本知识点

Bs4的基本api的使用,关于beautifulSoup的基本使用方法,我这里需要介绍在下面的脚本中我使用到的方法:

Soup = BeautifulSoup(data) #构建一个解析器

Tags = Soup.findAll(name,attr)

我们重点要讲findAll方法的两个参数:name和attr

Name:  指的是标签名,传入一个标签名的名称就可以返回所有固定名称的标签名

Attr:     是一个字典存储需要查找的标签参数,返回对应的标签

Tag.children      表示获取tag标签的所有子标签

Tag.string       表示获取tag标签内的所有字符串,不用一层一层索引下去寻找字符串

Tag.attrs[key]    表示获取tag标签内参数的键值对键为key的值

Tag.img         表示获取tag标签的标签名为img的自标签(一个)

6、利用BeautifulSoup获取58页面的指定信息(python2.7)

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import urllib
  5. import urllib2
  6. from bs4 import BeautifulSoup
  7.  
  8. url = 'http://ny.58.com/zufang/24584108096437x.shtml?qq-pf-to=pcqq.c2c'
  9.  
  10. # rq = urllib2.Request(url)
  11. # print rq
  12. rp = urllib.urlopen(url)
  13. html = rp.read()
  14. soup = BeautifulSoup(html)
  15.  
  16. # 获取标题
  17. title = soup.find_all(name='h1', attrs={'class': 'main-title font-heiti'})
  18. for data in title:
  19. data_title = data.get_text()
  20. print data_title
  21.  
  22. # 获取租金
  23. primary = soup.find_all(name='em', attrs={'class': 'house-price'})
  24. for data in primary:
  25. data_primary = data.get_text()
  26. print data_primary
  27.  
  28. # 获取房屋
  29. house_type = soup.find_all(name='div', attrs={'class': 'fl house-type c70'})
  30. for data in house_type:
  31. temp_type = data.get_text().replace('-', ' ')
  32. temp_type = ' '.join(temp_type.split())
  33. print temp_type
  34. # data_type_list = []
  35. # for d in temp_type:
  36. # data_type_list.append(d)
  37. # print data_type_list
  38.  
  39. # 获取小区
  40. xiaoqu = soup.find_all(name='div', attrs={'class': 'fl xiaoqu c70'})
  41. for data in xiaoqu:
  42. data_xiaoqu = data.get_text().strip()
  43. print data_xiaoqu
  44.  
  45. # 获取配置
  46. config = soup.find_all(name='li', attrs={'class': 'house-primary-content-li clearfix person-config'})
  47. for data in config:
  48. data_config = data.div.get_text().replace('-',' ')
  49. data_config = ' '.join(data_config.split())
  50. print data_config
  51.  
  52. # 获取联系人
  53. contact = soup.find_all(name='li', attrs={'class': 'house-primary-content-li clearfix person-contact'})
  54. for data in contact:
  55. data_contact = data.div.span.get_text()
  56. print data_contact
  57.  
  58. # 写入文件
  59. # with open('58_test1.txt','w') as f:
  60. # f.write('标题:'+data_title.decode('gbk'))
  61. # f.write('租金:' + data_primary)

BeautifulSoup的更多相关文章

  1. Python爬虫小白入门(三)BeautifulSoup库

    # 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...

  2. 使用beautifulsoup与requests爬取数据

    1.安装需要的库 bs4 beautifulSoup  requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...

  3. BeautifulSoup :功能使用

    # -*- coding: utf-8 -*- ''' # Author : Solomon Xie # Usage : 测试BeautifulSoup一些用法及容易出bug的地方 # Envirom ...

  4. BeautifulSoup研究一

    BeautifulSoup的文档见 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 其中.contents 会将换行也记录为一个子节 ...

  5. BeautifulSoup Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.

    BeautifulSoup很赞的东西 最近出现一个问题:Python 3.3 soup=BeautifulSoup(urllib.request.urlopen(url_path),"htm ...

  6. beautifulSoup(1)

    import re from bs4 import BeautifulSoupdoc = ['<html><head><title>Page title</t ...

  7. python BeautifulSoup模块的简要介绍

    常用介绍: pip install beautifulsoup4 # 安装模块 from bs4 import BeautifulSoup # 导入模块 soup = BeautifulSoup(ht ...

  8. BeautifulSoup 的用法

    转自:http://cuiqingcai.com/1319.html Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python ...

  9. BeautifulSoup的选择器

    用BeautifulSoup查找指定标签(元素)的时候,有几种方法: soup=BeautifulSoup(html) 1.soup.find_all(tagName),返回一个指定Tag元素的列表 ...

随机推荐

  1. [转载]jquery版小型婚礼(可动态添加祝福语)

    原文链接:http://www.cnblogs.com/tattoo/p/3788019.html 前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我 的百度生涯,一直 ...

  2. android键盘输入读取

    android键盘输入读取  监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...

  3. neurosolutions 人工神经网络集成开发环境 keras

    人工神经网络集成开发环境 :  http://www.neurosolutions.com/ keras:   https://github.com/fchollet/keras 文档    http ...

  4. ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state

    ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state 原因: 这个错误一般是因为索引状态为UNUS ...

  5. pip install Error - ReadTimeoutError: HTTPSConnectionPool

    pip install Error OSX 终端更新pip出错 sudo pip install --upgrade pip : 1.ReadTimeoutError: HTTPSConnection ...

  6. C# IEnumberable & IQueryable 区别

    转自 http://blog.csdn.net/daimeisi123/article/details/46976093 在应用到IEnumberable 和IQueryable两个接口时,代码往往很 ...

  7. Java注解基础概念总结

    注解的概念 注解(Annotation),也叫元数据(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能够调用Annotations.注解与类.接口.枚举在同一个层次 ...

  8. Qt5.5.1编译出来的程序出现libgcc_s_dw2-1.dll的解决方案

    问题如图: 输入"myudp2016.exe 1  " 后出现 这是因为没有在系统环境变量path里加上相关路径,我们添加如下路径: 比如说WIN7系统-开始-计算机-右键-属性- ...

  9. iOS开发CoreGraphics核心图形框架之一——CGPath的应用

    一.引言    CoreGraphics核心图形框架相较于UIKit框架更加偏于底层.在Objective-C工程中,CoreGraphics其中方法都是采用C语言风格进行编写的,同时其并不支持Obj ...

  10. VC++6.0 Win32 C2065:SM_XVIRTUALSCREEN

    百度了了一大堆,都说让重装vc++6.0,然而并没有什么卵用. 解决办法:找到你的vc6.0安装路径下的WINDOWS.H,将0x0400改为0x0500 Window各个版本对应的宏值WINVER: