鱼C论坛

 找回密码
 立即注册
查看: 2107|回复: 9

[已解决]爬虫,很急,有几个参数没懂,请大神指教

[复制链接]
发表于 2017-7-26 15:45:16 | 显示全部楼层 |阅读模式

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

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

x


问题1:soup.find("div","about"),这里面的"div","about",什么含义,为什么这么做??如何通过这些参数定位到时间和新闻内容标签上面的,
问题2:就是soup.find("div","about").contents[0][9:].encode('utf-8'),,[0][9:],这里的[0]代表什么,[9:]又表示什么含义

  1. # encoding: utf-8
  2. import requests
  3. import re
  4. from bs4 import BeautifulSoup
  5. import time

  6. class News:
  7.     def __init__(self,title,time,type,content):
  8.         self.title = title  #新闻标题
  9.         self.time = time    #新闻时间
  10.         self.type = type    #新闻类别
  11.         self.content = content  #新闻内容

  12. def getList(url):   #获取新闻链接地址
  13.     li = requests.get(url)      
  14.     res = r'url":"http:.*?.html'    #正则表达式获取链接地址
  15.     urls = re.findall(res,li.text)
  16.     for i in range(len(urls)):
  17.         urls[i] = urls[i][6:]
  18.     return urls

  19. def getNews(url):   #获取新闻内容
  20.     url = url[:-5]+"_0.html"    #处理链接获取全文
  21.     ss = requests.get(url)
  22.     soup = BeautifulSoup(ss.text,"html.parser")     #获取新闻内容,注意编码
  23.     title = soup.title.string[:-6].encode('utf-8')      
  24.     time = soup.find("div","about").contents[0][9:].encode('utf-8')
  25. #    type = soup.find("div","position lBlue").contents[3].string.encode('utf-8')
  26.     content = soup.find("div","content").get_text()[1:-1].encode('utf-8')#如果不采用[1:-1],新闻内容是反得,处理一下,才能正常
  27.     print(content.decode())
  28.     news = News(title,time,type,content)
  29.     return news

  30. def saveAsTxt(news):    #保存新闻内容
  31.     file = open('E:/news.txt','a')
  32.     file.write("标题:" + news.title.decode() +
  33.                "\t时间:" + news.time.decode() +
  34. #               "\t类型:"+ news.type +
  35.                "\t内容:"+ news.content.decode()  +
  36.                ""\n")

  37. start = time.clock()
  38. sum = 0
  39. for i in range(1,40):
  40.     wangzhi = "http://3g.163.com/touch/article/list/BA8J7DG9wangning/%s-40.html" %i
  41.     urls = getList(wangzhi)
  42.     sum = sum + len(urls)
  43. #    print "当前页解析出 %s 条" %len(urls)
  44.     j = 1
  45.     for url in urls:
  46.         print ("正在读取第%s页第%s/%s条:%s" %(i,j,len(urls),url.encode('utf-8')))
  47.         news = getNews(url)
  48.         saveAsTxt(news)
  49.         j = j + 1
  50. end = time.clock()
  51. print ("共爬取%s条新闻,耗时%f s" %(sum,end - start))
复制代码
最佳答案
2017-7-28 09:01:52
问题1:div表示的,about表示的是class='about’
问题2:contents是返回直接子标签,相当于指定标签的所有的下一级标签。contents[0]也就是第1个子标签。[9:]就是字符串切片。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-26 16:35:05 | 显示全部楼层
soup.find("div","about")是BeautifulSoup的用法,提取出标签。至于为什么使用soup.find("div","about").contents[0][9:].encode('utf-8')

你先把数据soup.find("div","about")打印出来或者查看网页源码,查看要提取的信息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-26 16:51:11 | 显示全部楼层
请参考 -> https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#find

soup.find("div","about")

第一个参数是查找名字为“div”的 tag,字符串对象会被自动忽略掉;

第二个参数则指定通过 CSS 类进行搜索。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-26 17:05:56 | 显示全部楼层
小甲鱼 发表于 2017-7-26 16:51
请参考 -> https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#find

soup.find("div","about")

楼主,借个楼,,小甲鱼老师,能帮我看看我的问题吗?
http://bbs.fishc.com/forum.php?m ... peid%26typeid%3D392
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-26 18:27:01 | 显示全部楼层
小甲鱼 发表于 2017-7-26 16:51
请参考 -> https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#find

soup.find("div","about")

http://bbs.fishc.com/thread-92882-1-1.html
鱼总,求帮忙看下我的问题,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-27 08:27:23 | 显示全部楼层
和vvv 发表于 2017-7-26 16:35
soup.find("div","about")是BeautifulSoup的用法,提取出标签。至于为什么使用soup.find("div","about").co ...

嗯嗯,尝试打印了,谢谢,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-27 09:59:46 | 显示全部楼层
sunnychou 发表于 2017-7-27 08:27
嗯嗯,尝试打印了,谢谢,

contents 好像是下面的所有的子标签
[0]表示第一个子标签。
[9:]子标签内容的从第9位开始到结束
应该是这样,错了看文档。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-27 10:32:34 | 显示全部楼层
本帖最后由 sunnychou 于 2017-7-27 10:33 编辑
鬼人 发表于 2017-7-27 09:59
contents 好像是下面的所有的子标签
[0]表示第一个子标签。
[9:]子标签内容的从第9位开始到结束


contents返回的是一个列表,使用contents[0],能过滤掉列表符号,下面是结果,[9:]和你说的一样

这个列表的范围只有一个没有这个(contents[1]),是代表一个子标签么
  1. head_tag.contents#列表形式输出
  2. [<title>The Dormouse's story</title>]  ->结果
  3. title_tag = head_tag.contents[0]
  4. title_tag
  5. <title>The Dormouse's story</title> ->结果
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 09:01:52 | 显示全部楼层    本楼为最佳答案   
问题1:div表示的,about表示的是class='about’
问题2:contents是返回直接子标签,相当于指定标签的所有的下一级标签。contents[0]也就是第1个子标签。[9:]就是字符串切片。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-31 08:50:37 | 显示全部楼层
小甲鱼 发表于 2017-7-26 16:51
请参考 -> https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#find

soup.find("div","about")

蟹蟹小甲鱼老师的回复, 认真看了文档,把这些问题给总结了一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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