python小菜遇到问题TypeError: expected string or buffer,求解答

Star-Counter 2016-08-16 05:24:44
完整错误信息如下
连接失败,错误原因 Bad Request
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/demo/.idea/learndemo/demo2.py", line 127, in <module>
bdtb.start()
File "C:/Users/Administrator/PycharmProjects/demo/.idea/learndemo/demo2.py", line 103, in start
pageNum = self.getPageNum(indexPage)
File "C:/Users/Administrator/PycharmProjects/demo/.idea/learndemo/demo2.py", line 65, in getPageNum
result = re.search(pattern, page)
File "C:\Python27\lib\re.py", line 146, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer
...全文
5208 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Star-Counter 2016-08-17
  • 打赏
  • 举报
回复
经过排除错误,发现是因为输入帖子代码有问题,在输入之后按下空格之后才能回车,不然就会直接跳转到浏览器,所以在复制之后又输了空格,但这样就导致网址不正确,如果把帖子代码最后一位删除手动输入可以回车往下运行,这样才能避免该错误。(偷懒不得)
Star-Counter 2016-08-16
  • 打赏
  • 举报
回复
对了,忘了说是python2.7版本
Star-Counter 2016-08-16
  • 打赏
  • 举报
回复
# -*- coding:utf-8 -*-
import urllib2
import urllib
import re

class Tool:
    # 去除img标签,7位长空格
    removeImg = re.compile('<img.*?>| {7}|')
    # 删除超链接标签
    removeAddr = re.compile('<a.*?>|</a>')
    # 把换行的标签换为\n
    replaceLine = re.compile('<tr>|<div>|</div>|</p>')
    # 将表格制表<td>替换为\t
    replaceTD = re.compile('<td>')
    # 把段落开头换为\n加空两格
    replacePara = re.compile('<p.*?>')
    # 将换行符或双换行符替换为\n
    replaceBR = re.compile('<br><br>|<br>')
    # 将其余标签剔除
    removeExtraTag = re.compile('<.*?>')
    def replace(self, x):
        x = re.sub(self.removeImg, "", x)
        x = re.sub(self.removeAddr, "", x)
        x = re.sub(self.replaceLine, "\n", x)
        x = re.sub(self.replaceTD, "\t", x)
        x = re.sub(self.replacePara, "\n    ", x)
        x = re.sub(self.replaceBR, "\n", x)
        x = re.sub(self.removeExtraTag, "", x)
        return x.strip()

class BDTB:
    def __init__(self,baseUrl,seeLZ,floorTag):
        self.baseURL=baseUrl
        self.seeLZ='?see_LZ='+str(seeLZ)
        self.tool=Tool()
        self.file=None
        self.floor=1
        self.defaultTitle=u'百度贴吧'
        self.floorTag=floorTag

    def getpage(self,pageNum):
        try:
            url=self.baseURL+self.seeLZ+'&pn='+ str(pageNum)
            user_agent = "Mozilla/5.0 (Windows NT 6.1)"
            headers = {"User-Agent": user_agent}
            request=urllib2.Request(url,headers=headers)
            response=urllib2.urlopen(request)
            content= response.read().decode('utf-8')
            return content
        except urllib2.URLError,e:
            if hasattr(e,"reason"):
                print "连接失败,错误原因",e.reason
                return None

    def getTitle(self,page):
        pattern = re.compile(r'<h3 class="core_title_txt pull-left text-overflow .*?>(.*?)</h3>',re.S)
        result = re.search(pattern,page)
        if result:
            return  result.group(1).strip()
        else:
            return  None

    def getPageNum(self,page):
        pattern = re.compile(r'<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>', re.S)
        result = re.search(pattern, page)
        if result:
            return result.group(1).strip()
        else:
            return None

    def getContent(self, page):
        pattern = re.compile(r'<div id="post_content_.*?>(.*?)</div>', re.S)
        items = re.findall(pattern, page)
        contents=[]
        for item in items:
            # print floor, u"楼------------------------------------------------------------------------------------------------------------------------------------\n"
            # print self.tool.replace(item)
            content="\n"+self.tool.replace(item)+"\n"
            print content
            contents.append(content.encode('utf-8'))
        return contents

    def setFileTitle(self, title):
        # 如果标题不是为None,即成功获取到标题
        if title is not None:
            self.file = open(title + ".txt", "w+")
        else:
            self.file = open(self.defaultTitle + ".txt", "w+")

    def writeData(self, contents):
        # 向文件写入每一楼的信息
        for item in contents:
            if self.floorTag == '1':
                # 楼之间的分隔符
                floorLine = "\r\n" + str(
                    self.floor) + u"-----------------------------------------------------------------------------------------\n"
                self.file.write(floorLine)
            self.file.write(item)
            self.floor += 1

    def start(self):
        indexPage = self.getpage(1)
        pageNum = self.getPageNum(indexPage)
        title = self.getTitle(indexPage)
        self.setFileTitle(title)
        if pageNum == None:
            print "URL已失效,请重试"
            return
        try:
            print "该帖子共有" + str(pageNum) + "页"
            for i in range(1, int(pageNum) + 1):
                print "正在写入第" + str(i) + "页数据"
                page = self.getPage(i)
                contents = self.getContent(page)
                self.writeData(contents)
        # 出现写入异常
        except IOError, e:
            print "写入异常,原因" + e.message
        finally:
            print "写入任务完成"

print u"请输入帖子代号"
baseURL = 'http://tieba.baidu.com/p/' + str(raw_input('http://tieba.baidu.com/p/'))
seeLZ = raw_input("是否只获取楼主发言,是输入1,否输入0\r\n")
floorTag = raw_input("是否写入楼层信息,是输入1,否输入0\r\n")
bdtb = BDTB(baseURL,seeLZ,floorTag)
bdtb.start()

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧