2012-08-03 1 views
1

Tomcat 서버에서 서비스 목록을 추출하여 데이터베이스에 삽입하는 코드가 있습니다. 의 도움 후xpath 출력을 두 변수로 나눠서 데이터베이스에 삽입하는 우아한 방법

<TABLE bgcolor=#dddddd border=1> 
<TR> 
<TD valign="top"><B>name</B></TD> 
<TD>Loader</TD> 
</TR> 
<TR> 
<TD valign="top"><B>enabled</B></TD> 
<TD>true</TD> 
</TR> 
<TR> 
<TD valign="top"><B>loadok</B></TD> 
<TD>13</TD> 
</TR> 
</TABLE> 
<TABLE bgcolor=#dddddd border=1> 
<TR> 
<TD valign="top"><B>name</B></TD> 
<TD>tester</TD> 
</TR> 
<TR> 
<TD valign="top"><B>enabled</B></TD> 
<TD>false</TD> 
</TR> 
<TR> 
<TD valign="top"><B>loadok</B></TD> 
<TD>13</TD> 
</TR> 
</TABLE> 

는 다음, 실제 코드 (느릅 나무 작품)

#!/usr/bin/env python 

import psycopg2 
import urllib2 
import base64 
import sys 
import re 
import lxml.html as LH 

con = None 

try: 

    con = psycopg2.connect(database='xx', user='xx',password='xx',host='vxx') 
    cur = con.cursor() 
    qry ="select iservers.env,iservers.family,iservers.prefix,iservers.iserver,iservers.login,iservers.password,services.service," +\ 
    "proxy_access.proxy_server,proxy_access.proxy_user,proxy_access.proxy_pass "  +\ 
    "from services,iservers,proxy_access where iservers.env='TEST' and services.id='2' " 
    cur.execute(qry) 
    data = cur.fetchall() 

    for result in data: 

     env  = result[0] 
     family = result[1] 
     prefix = result[2] 
     iserver = result[3] 
     login = result[4] 
     password = result[5] 
     service = result[6] 
     proxyHost = result[7] 
     proxyUser = result[8] 
     proxyPass = result[9] 

     proxy_auth = "http://"+proxyUser+":"+proxyPass+"@"+proxyHost 
     proxy_handler = urllib2.ProxyHandler({"http": proxy_auth}) 

     opener = urllib2.build_opener(proxy_handler) 
     urllib2.install_opener(opener) 
     request = urllib2.Request("http://"+iserver+service) 
     base64string = base64.encodestring('%s:%s' % (login, password)).replace('\n', '') 
     request.add_header("Authorization", "Basic %s" % base64string) 
     response = urllib2.urlopen(request) 
     html = response.read() 

     ###################### CHANGE THIS TO USE A HTML PARSER 
     regex = r"name</B></TD>\s<TD>(.*?)</TD>\s</TR>\s<TR>\s(.*)enabled</B></TD>\s<TD>(.*)</TD>" 
     for m in re.finditer(regex,html): 
      print "inserting\t"+iserver+"\t"+m.group(1) 
      cur.execute("INSERT INTO pereirtc.package_status (env,family,iserver,prefix,package,status) values (%s,%s,%s,%s,%s,%s)",(env,family,iserver,prefix,m.group(1),m.group(3))) 
      con.commit() 
     ###################### END 
except psycopg2.DatabaseError, e: 
    print 'Error %s' % e 
    sys.exit(1) 

finally: 

    if con: 
     con.close() 

: Basicaly이 코드는 다음과 같은 구조의 HTML 결과에서 큰 출력 (100 개 결과)를 받게됩니다 stackoverflow, 내가 libxml "변경이 ...."블록을 변경하는 것이 좋습니다. 그래서 내가 사용하는 다음과 같은 블록을 가지고 :

('name', 'Loader') 
('enabled', 'true') 

그리고 내가 원하는 것은이하는에 삽입 XPath를 사용하여 결과를 삽입 : 위의 예와

doc = LH.fromstring(html) 
    tds = (td.text_content() for td in doc.xpath("//td")) 
    for td, val in zip(*[tds]*2): 
     if td in ("name","enabled"): 
      print (td,val) 

, 나는 결과를 데이터 베이스. 이후 메신저 파이썬에서 시작, 메신저 내가 xpath/libxml로 할 수있는 방법에 차단.

감사합니다.

답변

0

난 당신이 다음과 같은 간단한 작업을 의미 있는지 확실하지 않습니다,하지만 분할 결과는 다음과 같이 두 변수로 이루어집니다.

doc = LH.fromstring(html) 
tds = (td.text_content() for td in doc.xpath("//td")) 
for td, val in zip(*[tds]*2): 
    if td == "name": 
     name = val 
    elif td == "enabled": 
     enabled = val 

print name 
print enabled 
+0

안녕을 수행하십시오 –

+1

안녕하세요, if 조건 안에 인쇄를 삽입 한 후 솔루션에 근무 :) –

0

내가 추측하고있어 그 :

blah = [('name', 'Loader'), ('enabled', 'true')] 
blahd = dict(blah) 
cursor.execute('insert into blah (name, enabled) values(%(name)s, %(enabled)s)', blahd) 

또는 ... 이름 값을 사용하지 :

cursor.execute('insert into blah (name, enabled) values(?, ?)', [i[1] for i in blah]) 
+0

이름에서 값을 알리는 것을 잊었으며 동적으로 사용할 수 있습니다. 그것의 서비스 목록. 이 ㅋ에서 로더 진정한를 만들기 위해 어떤 방법 = [('이름', '로더'), ('진실' '사용 가능')] 는 TD의 값을 수신? –

+0

@ ThalesPereira err, 그럼 DB 스키마는 무엇입니까? –

+0

그런 다음 튜플/시퀀스와 함께 내가 뭐라했는지 두 번째 요소로 STATUS를 만듭니다 ... 또는 DBAPI에 .executemany 메서드가있는 경우이를 사용하십시오. –

관련 문제