鱼C论坛

 找回密码
 立即注册
查看: 3237|回复: 17

[已解决]["i love fishc.com" ]外边的 [] 的如何摘掉???

[复制链接]
发表于 2018-5-18 17:50:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kerwin_lui 于 2018-5-18 17:57 编辑

背景介绍:
本人参加了今年的公务员考试,近日突然想把今年 “中公教育” 网上的 “浙江省的公务员面试成绩” 爬取下来。
经过网页踩点,发现都是以excel文件的形式存在网页上,遂根据 《零基础入门python》 这本书的内容开始我人生中的第一个爬虫~~
目的:下载网站上近两百个excel文件


代码如下:
  1. import requests
  2. import urllib
  3. import re
  4. from lxml import etree

  5. headers = {}
  6. headers['User-Agent'] ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
  7. headers['Referer'] = 'http://zj.offcn.com/zg/skzcj/'

  8. #获取响应的文本,并做好编码修正
  9. def getHTMLtext(url):
  10.     try:
  11.         r = requests.get(url,timeout = 20, headers = headers)
  12.         r.raise_for_status()
  13.         r.encoding = r.apparent_encoding
  14.         return r.text
  15.     except:
  16.         return "产生异常"


  17. #匹配xpath语句,得到url
  18. def matchXpathURL(html_text,condition_xpath):   #传入html的文本和xpath语句的条件,匹配出对应的url
  19.     obj_xpath = etree.HTML(html_text)        #生成xpath解析对象
  20.     match_url = obj_xpath.xpath(condition_xpath)
  21.     return match_url

  22. #匹配re语句,得到url的list形式
  23. def matchReURL(html_text,condition_re):
  24.     match_url = re.findall(condition_re,html_text)
  25.     return match_url

  26. #定义一个下载器,简化代码
  27. def download(url,file_path):
  28.     content = requests.get(url).content   #二进制数据
  29.    
  30.     with open(file_path,"wb") as f :
  31.         f.write(content)  
  32.    
  33.    
  34. if __name__ == "__main__":
  35.     pri_url = "http://zj.offcn.com/zg/skzcj/"
  36.     pri_url_html = getHTMLtext(pri_url)    #起始爬虫网页的html文本(已修正编码)   

  37.     condition_city = "//div[@class='xc'][1]//li[position()>1]/a/@href"   #城市的xpath筛选条件
  38.     city_url = matchXpathURL(pri_url_html,condition_city)    #筛选,得到所有城市的url
  39.    
  40.     ii = 1   # 初始化:目标文件序号
  41.    
  42.     #用循环,找到每个城市的每个部门的url,并找到xls文件,下载
  43.     for each in city_url:
  44.         print("城市的网页地址 : ",each,"\n\n")    #打印每一个城市的url                        
  45.         city_url_html = getHTMLtext(each)               #得到所有城市的html文本
  46.         condition_department = r'<p><a href="(http://zj.offcn.com/html.*?\.html)".*?2018浙江公务员考试总成绩及体检名单'  #部门的re筛选条件
  47.         department_url = matchReURL(city_url_html,condition_department)  #筛选,得到所有部门的url
  48.         
  49.         

  50.         #获取到每个部门的url,继续用循环获得每个部门的html页面,再筛选到xls文件所在位置
  51.         for i,e in enumerate(department_url):
  52.             print("部门的网页地址 : ",e)   #打印每一个部门的url
  53.             department_html = getHTMLtext(e)
  54.             condition_xls = r'<a href="(http:.*?\.(?:xls|doc|pdf|xlsx|docx))"'
  55.             target_xls_url = matchReURL(department_html,condition_xls)   #获取到每个部门的成绩文件,供后续下载-----list形式--["www....."]
  56.             print("目标文件的下载地址 : ",target_xls_url)   #打印目标文件的url,检测目标文件的url是否获取正常
  57.             
  58.             
  59.             
  60.             #用for循环,将list形式转化为字符串——(把[]去掉)
  61.             for target_xls_url_real in target_xls_url:
  62.                
  63.                
  64.                 #确定文件的后缀名,确保文件存储为正确的格式!
  65.                 suffix_condition = r'([a-z]+)


  66.                 suffix_name = matchReURL(target_xls_url_real,suffix_condition)  #得到后缀名的list格式,等待去帽~~
  67.                 #去帽:
  68.                 for suffix_name_real in suffix_name :
  69.                     file_name = r"\%d.%s" % (ii,suffix_name_real)    #确定每个目标文件的命名
  70.                     ii += 1
  71.                     file_path = r"C:\Users\kerwin\Desktop\spider\ZG_excel" + file_name     #确定文件下载的路径
  72.                     print("文件保存路径 : ",file_path)
  73.                     download(target_xls_url_real,file_path)
  74.                     print("成功下载了一个文件 !!\n\n")
  75.                     
  76.         
  77.     print("全部文件下载完成 !!\n")  #提示结束
复制代码




今天刚刚写完,发现有很多很多问题!!
特别是for循环重复写了好几个,但并没有真正起到循环的作用,仅仅是想把 ["i love fishc.com" , "i love fishc.com"] 外边的 [] 的帽子给摘掉,变成单纯的字符串~~

不知道除了for循环 还要怎么实现??
初学者无知,若犯了低级错误,不要见怪~~~

也希望鱼C的大牛们,能给初学者提些改进的建议,不管是代码逻辑上、注释上、变量命名上、正则匹配上.......... 的问题,万分感谢了!!!!


最佳答案
2018-5-18 18:08:46
  1. tmp = ["i love fishc.com" , "i love fishc.com"]
  2. print(','.join(tmp))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-18 18:03:38 | 显示全部楼层
本帖最后由 thexiosi 于 2018-5-18 18:12 编辑

不好意思,理解错了,请直达5楼 囧rz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:04:07 | 显示全部楼层
???你得有一个容器放着两个元素啊,怎么变成str法???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 18:06:53 | 显示全部楼层
新手·ing 发表于 2018-5-18 18:04
???你得有一个容器放着两个元素啊,怎么变成str法???

或者说提取里边的字符串吧~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:08:46 | 显示全部楼层    本楼为最佳答案   
  1. tmp = ["i love fishc.com" , "i love fishc.com"]
  2. print(','.join(tmp))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:09:08 | 显示全部楼层
thexiosi 发表于 2018-5-18 18:03
仅仅是想把 ["i love fishc.com" , "i love fishc.com"] 外边的 [] 的帽子给摘掉,变成单纯的字符串~~

h ...

个人觉得是对列表操作。。
大神你这个代码太不友好了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:10:52 | 显示全部楼层
新手·ing 发表于 2018-5-18 18:09
个人觉得是对列表操作。。
大神你这个代码太不友好了。。

我太粗心了,把题意理解错了,抱歉抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:14:08 | 显示全部楼层
新手·ing 发表于 2018-5-18 18:09
个人觉得是对列表操作。。
大神你这个代码太不友好了。。

我的编程技能至多就是你的2成,纯粹小白一名啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 18:22:29 | 显示全部楼层
新手·ing 发表于 2018-5-18 18:09
个人觉得是对列表操作。。
大神你这个代码太不友好了。。

那若是要分别将这两个字符串提取到两个变量中呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 18:23:50 | 显示全部楼层
thexiosi 发表于 2018-5-18 18:03
不好意思,理解错了,请直达5楼 囧rz

哈哈哈,没关系,我感觉是我问的不好~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 18:38:56 | 显示全部楼层
  1. a = ['str1', 'str2']
  2. var1, var2 = a
复制代码

这个意思么。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 19:04:40 | 显示全部楼层
Charles未晞 发表于 2018-5-18 18:38
这个意思么。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 ...

a = ['str1', 'str2']
var1, var2 = a[0] , a[1]

这个的实现是这样的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 19:38:33 | 显示全部楼层
kerwin_lui 发表于 2018-5-18 19:04
a = ['str1', 'str2']
var1, var2 = a[0] , a[1]
  1. var1, var2 = ['str1', 'str2']
  2. var1, var2 = ['str1', 'str2'][0] + ['str1', 'str2'][1]
复制代码

结果是一样的。。。内核实现不清楚。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 20:40:02 | 显示全部楼层
thexiosi 发表于 2018-5-18 18:14
我的编程技能至多就是你的2成,纯粹小白一名啦

没有啦,我只是个萌新而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 20:40:41 | 显示全部楼层
kerwin_lui 发表于 2018-5-18 18:22
那若是要分别将这两个字符串提取到两个变量中呢?

那就不用变成字符串了,
  1. a, b = ['a', 'b']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 20:42:35 | 显示全部楼层
满意就给个最佳答案呗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 21:46:01 | 显示全部楼层
Charles未晞 发表于 2018-5-18 19:38
结果是一样的。。。内核实现不清楚。。。

恩恩,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 21:46:31 | 显示全部楼层
新手·ing 发表于 2018-5-18 20:42
满意就给个最佳答案呗。

哈哈哈,必须的,非常感谢哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表