我想为SOAP / XML进行实时数据包监控。这是代码。
from scapy.all import *
def pack_callback(packet):
if packet["TCP"].payload:
payload = str(packet["TCP"].payload)
Code = '<ResponseCode>(.*?)<|<ResponseRunTime>(.*?)<'
pat = re.compile(Code)
n = pat.findall(payload)
if n:
#print n.groups()
print n
sniff(filter='tcp and port 186 or port 86',prn=pack_callback,iface='vmxnet3 Ethernet Adapter')`
但如果我使用re.search
,我得到('0', None)
,当我使用re.findall
时,我得到了[('0', ''), ('', '1763')]
我的问题是,如何才能获得('0', '1763')
?
我的意思是第一次匹配<ResponseCode>(.*?)<
然后匹配<ResponseRunTime>(.*?)<
不是每次都从头开始搜索XML。
SOAP响应如下:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ns3:RetrieveQuotationResponse xmlns>
<ResponseVersion>5</ResponseVersion>
<ResponseCode>0</ResponseCode>
<ResponseMessage>Correct Petition</ResponseMessage>
<ResponseRunTime>1887</ResponseRunTime>
<ResponseData>
<billingDays>2</billingDays>
<destinationCurrencyValue>0.0</destinationCurrencyValue>
<dropOffDate>2018-02-23</dropOffDate>
<dropOffOfficeId>D2</dropOffOfficeId>
<dropOffOfficeNameParis</dropOffOfficeName>
<dropOffTime>09:00</dropOffTime>
<pickUpDate>2018-02-21</pickUpDate>
<pickUpOfficeId>D2</pickUpOfficeId>
<pickUpOfficeName>Paris</pickUpOfficeName>
<pickUpTime>09:00</pickUpTime>
<quotationNote>There Are 29 Car Types Availables.</quotationNote>
<quotationOptions>
速度几乎是每秒110包。 这就是我想要保持wordround尽可能少的原因,否则Python可以不那么快地处理所有的pakets。
感谢。