Python 中正则表达式无法匹配的问题

listhome 2011-07-04 09:18:24
是这样的,在下新手,在使用Python遇到如下问题,请各位不吝赐教,先谢谢了。

需求
我用Python的UrlLib模块返回一个网页的源码,然后用正则找出我要的部分。

在编写正则时,因为每次要抓网页需要时间,所以我就把网页的内容保存成字符串,然后用正则匹配这个字符串。

问题:
正则写好后,使用本地字符串,完全没有问题,这时我用抓取网页,就根本匹配不上!但是,如果我把匹配不上的网页Print出来,存成字符串,就马上可以用正则匹配!网上查了,有人说是编码的问题,但我还是不知道怎么解决。谢谢大家

我的源代码的编码是GBK
# coding=GBK

我的正则条件是
if taskListPage.find(U"任务进行中") != -1:
Log("有")
Log(taskListPage)
...全文
399 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-07-05
  • 打赏
  • 举报
回复
正则的编码也要是GBK的才好。
listhome 2011-07-04
  • 打赏
  • 举报
回复
不好意思,没看懂你的问题,我要从抓回来网页里匹配
应该是String吧
iambic 2011-07-04
  • 打赏
  • 举报
回复
问你两个问题都不回复。自己解决吧。
listhome 2011-07-04
  • 打赏
  • 举报
回复
pattern = re.compile(ur'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.DOTALL | re.I | re.U)
这句匹配不上
listhome 2011-07-04
  • 打赏
  • 举报
回复
上面那个编码不对,我改一下


# coding=GBK
'''
Created on 2011-7-1

@author: Yunanw
'''

import cookielib, urllib2, urllib
import time
import re
import string
import sys

debug = 1

#
# 用户名或密码
#
usrAndPwd = {"UserName":"selina", "PassWord":"123456Aa"}

#保证金
GMoney = 30

cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

def Log(msg):
if debug:
print msg

def Post(url, Data):
request = urllib2.Request(url, urllib.urlencode(Data))
page = urlOpener.open(request)
return page.read()

def Get(url):
request = urllib2.Request(url)
page = urlOpener.open(request)
return page.read()

def Login():
##登陆的URL
loginUrl = "http://www.shuazuanla.com/user_log.asp"
Post(loginUrl, usrAndPwd)

def OpenTaskListPage():
#return Get("http://www.shuazuanla.com/taobao.asp?flag=0")

def AnlyseTaskListPage(taskListPage):
#分析任务列表
Log("开始分析")

if taskListPage.find(U"等待接手") != -1:
Log("有")
Log(taskListPage)



pattern = re.compile(u'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.I | re.DOTALL)
taskList = []
for task in pattern.findall(taskListPage):

taskStatePattern = re.compile(u'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.DOTALL | re.I)

for avilTask in taskStatePattern.findall(task):

getMeoneyPattern = re.compile(r'^\s*(<td>.*等待接手.*?</a></td>)', re.M | re.DOTALL | re.I | re.U)
cells = getMeoneyPattern.findall(avilTask)
taskmoney = cells[1].replace("<td>", "").replace("</td>", "").replace(" ", "").replace(" ", "")
taskmoney = string.atof(taskmoney)

if (taskmoney < GMoney):
dinPattern = re.compile(r'\d + ')
taskID = dinPattern.findall(cells[7])[0]
taskList.append(taskID)

return taskList

def ViewTaskPage(taskID):
ViewTaskPageUrl = "http://www.shuazuanla.com/showinfo.asp?action=jie&din=" + taskID
return Get(ViewTaskPageUrl);

def IsTaskAvil(taskPage):
return taskPage.find(' < input type = "Submit" name = "Submit"disabled value = ') == -1

def ProcessTask(taskID):
print "找到任务ID" + taskID
taskPage = ViewTaskPage(taskID)

print submitTask(taskID)

if IsTaskAvil(taskPage):
submitTask(submitTask)

def ProcessTaskAsync(taskID):
return ProcessTask(taskID)

def submitTask(taskID):
url = 'http://www.shuazuanla.com/showinfo.asp?action=sbuto&din=' + taskID
postData = {"xiaohao":"", "xiaohao":"" , "txiaohao_842":"selina10121", "select":"" , "opPassWord":"xunan19821012", "Submit":""}
return Post(url, postData)



Login()

while(1):
taskListPage = OpenTaskListPage()
TaskList = AnlyseTaskListPage(taskListPage)

if len(TaskList) == 0:
print "未找到可用任务"

for taskid in TaskList:
ProcessTaskAsync(taskid)

time.sleep(2)

listhome 2011-07-04
  • 打赏
  • 举报
回复
我把全部代码贴上

#coding=utf-8
'''
Created on 2011-7-1

@author: Yunanw
'''

import cookielib, urllib2, urllib
import time
import re
import string
import sys

debug = 1

#
# 用户名或密码
#
usrAndPwd = {"UserName":"selina", "PassWord":"123456Aa"}

#保证金
GMoney = 30

cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

def Log(msg):
if debug:
print msg

def Post(url, Data):
request = urllib2.Request(url, urllib.urlencode(Data))
page = urlOpener.open(request)
return page.read()

def Get(url):
request = urllib2.Request(url)
page = urlOpener.open(request)
return page.read()

def Login():
##登陆的URL
loginUrl = "http://www.shuazuanla.com/user_log.asp"
Post(loginUrl, usrAndPwd)

def OpenTaskListPage():
return Get("http://www.shuazuanla.com/taobao.asp?flag=0")

def AnlyseTaskListPage(taskListPage):
#分析任务列表
Log("开始分析")

if taskListPage.find("等待接手") != -1:
Log("有")
Log(taskListPage)

pattern = re.compile(ur'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.DOTALL | re.I | re.U)
taskList = []
for task in pattern.findall(taskListPage):

taskStatePattern = re.compile(r'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.DOTALL | re.I)

for avilTask in taskStatePattern.findall(task):

getMeoneyPattern = re.compile(r'^\s*(<td>.*等待接手.*?</a></td>)', re.M | re.DOTALL | re.I | re.U)
cells = getMeoneyPattern.findall(avilTask)
taskmoney = cells[1].replace("<td>", "").replace("</td>", "").replace(" ", "").replace(" ", "")
taskmoney = string.atof(taskmoney)

if (taskmoney < GMoney):
dinPattern = re.compile(r'\d + ')
taskID = dinPattern.findall(cells[7])[0]
taskList.append(taskID)

return taskList

def ViewTaskPage(taskID):
ViewTaskPageUrl = "http://www.shuazuanla.com/showinfo.asp?action=jie&din=" + taskID
return Get(ViewTaskPageUrl);

def IsTaskAvil(taskPage):
return taskPage.find(' < input type = "Submit" name = "Submit"disabled value = ') == -1

def ProcessTask(taskID):
print "找到任务ID" + taskID
taskPage = ViewTaskPage(taskID)

print submitTask(taskID)

if IsTaskAvil(taskPage):
submitTask(submitTask)

def ProcessTaskAsync(taskID):
return ProcessTask(taskID)

def submitTask(taskID):
url = 'http://www.shuazuanla.com/showinfo.asp?action=sbuto&din=' + taskID
postData = {"xiaohao":"", "xiaohao":"" , "txiaohao_842":"selina10121", "select":"" , "opPassWord":"xunan19821012", "Submit":""}
return Post(url, postData)



Login()

while(1):
taskListPage = OpenTaskListPage()
TaskList = AnlyseTaskListPage(taskListPage)

if len(TaskList) == 0:
print "未找到可用任务"

for taskid in TaskList:
ProcessTaskAsync(taskid)

time.sleep(2)



iambic 2011-07-04
  • 打赏
  • 举报
回复
1. r'...'
2. 你要匹配的是unicode还是str?
listhome 2011-07-04
  • 打赏
  • 举报
回复
上面那个贴错了,正则条件是

pattern = re.compile(u'^\s*(<tr>$\s*<td height="25.*?</tr>)$', re.M | re.I | re.DOTALL)
iambic 2011-07-04
  • 打赏
  • 举报
回复
U"任务进行中"改成'\xc8\xce\xce\xf1\xbd\xf8\xd0\xd0\xd6\xd0'试试。
listhome 2011-07-04
  • 打赏
  • 举报
回复
自己消灭零回复

37,743

社区成员

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

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