• 全部
  • 互动交流
  • 文章分享

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

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

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

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

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

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

我的正则条件是
if taskListPage.find(U"任务进行中") != -1:
Log("有")
Log(taskListPage)
...全文
132 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
greatghoul 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
自己消灭零回复
回复
发帖
脚本语言
创建于2007-08-27

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
帖子事件
创建了帖子
2011-07-04 09:18
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: