2015-11-06 61 views
-1

我想利用該網站的三個組成部分,第一個是Ipadress,港口和protoco,我用的HTMLParser在Python來解決,但在標籤下面的代碼有沒有attrisbute和價值獲取數據

<html xmlns="http://www.w3.org/1999/xhtml"> 
 
<head> 
 
<title>proxy-list</title> 
 
</head> 
 
\t <body> 
 
\t \t <table> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>192.168.1.10</td>  
 
\t \t \t \t <td>HTTP1</td> 
 
\t \t \t \t <td>Vietnam</td> 
 
\t \t \t \t <td>8080</td> 
 
\t \t \t \t <td>a</td> 
 
\t \t \t \t <td>%d1</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>10.25.100.10</td> 
 
\t \t \t \t <td>HTTPS2</td> 
 
\t \t \t \t <td>Campuchia</td> 
 
\t \t \t \t <td>3214</td> 
 
\t \t \t \t <td>b</td> 
 
\t \t \t \t <td>%d2</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>203.25.10.110</td> 
 
\t \t \t \t <td>HTTP3</td> 
 
\t \t \t \t <td>ThaiLan</td> 
 
\t \t \t \t <td>123</td> 
 
\t \t \t \t <td>c</td> 
 
\t \t \t \t <td>%d3</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>220.155.10.13</td> 
 
\t \t \t \t <td>HTTP4</td> 
 
\t \t \t \t <td>Itali</td> 
 
\t \t \t \t <td >1000</td> 
 
\t \t \t \t <td>d</td> 
 
\t \t \t \t <td>%d4</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>220.155.10.113</td> 
 
\t \t \t \t <td>HTTP5</td> 
 
\t \t \t \t <td>Itali</td> 
 
\t \t \t \t <td >505</td> 
 
\t \t \t \t <td>d</td> 
 
\t \t \t \t <td>%d4</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>220.155.10.115</td> 
 
\t \t \t \t <td>HTTPS6</td> 
 
\t \t \t \t <td>Itali</td> 
 
\t \t \t \t <td >321</td> 
 
\t \t \t \t <td>d</td> 
 
\t \t \t \t <td>%d4</td> 
 
\t \t \t </tr> 
 
\t \t </table> 
 
\t </body> 
 
</html>

那麼,如何讓所有3個組件IPadress和端口,protoco。

+0

任何你試過的東西? –

+0

讓所有**''**阻止相同的結構?我看到第三個街區沒有港口。並且不要將代碼粘貼爲'answers',只需編輯你的問題。 –

+0

的結構完全相同 –

回答

1

嘗試使用lxml

from lxml import html 

HTML_CODE = """<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>proxy-list</title> 
</head> 
    <body> 
     <table> 
      <tr> 
       <td>192.168.1.10</td>  
       <td>HTTP1</td> 
       <td>Vietnam</td> 
       <td>8080</td> 
       <td>a</td> 
       <td>%d1</td> 
      </tr> 
      <tr> 
       <td>10.25.100.10</td> 
       <td>HTTPS2</td> 
       <td>Campuchia</td> 
       <td>3214</td> 
       <td>b</td> 
       <td>%d2</td> 
      </tr> 
      <tr> 
       <td>203.25.10.110</td> 
       <td>HTTP3</td> 
       <td>ThaiLan</td> 
       <td>3215</td> 
       <td>c</td> 
       <td>%d3</td> 
      </tr> 
      <tr> 
       <td>220.155.10.13</td> 
       <td>HTTP4</td> 
       <td>Itali</td> 
       <td >1000</td> 
       <td>d</td> 
       <td>%d4</td> 
      </tr> 
      <tr> 
       <td>220.155.10.13</td> 
       <td>HTTP5</td> 
       <td>Itali</td> 
       <td >1000</td> 
       <td>d</td> 
       <td>%d4</td> 
      </tr> 
      <tr> 
       <td>220.155.10.13</td> 
       <td>HTTP6</td> 
       <td>Itali</td> 
       <td >1000</td> 
       <td>d</td> 
       <td>%d4</td> 
      </tr> 
     </table> 
    </body> 
</html>""" 

tree = html.fromstring(HTML_CODE) 

for block in tree.xpath('//table/tr'): 
    ip, protocol, _, port, _, _ = [x.strip() for x in block.xpath('.//text()') if x.strip() not in ""] 
    print "IP: {}".format(ip) 
    print "Protocol: {}".format(protocol) 
    print "Port: {}\n".format(port) 

輸出:

IP: 192.168.1.10 
Protocol: HTTP1 
Port: 8080 

IP: 10.25.100.10 
Protocol: HTTPS2 
Port: 3214 

IP: 203.25.10.110 
Protocol: HTTP3 
Port: 3215 

IP: 220.155.10.13 
Protocol: HTTP4 
Port: 1000 

IP: 220.155.10.13 
Protocol: HTTP5 
Port: 1000 

IP: 220.155.10.13 
Protocol: HTTP6 
Port: 1000 
+0

非常感謝:D –

+0

但我想用HTMLParser編寫,沒有AndrésPérez-Albela H? –

+0

對不起AndrésPérez-Abela H,我非常感謝您的幫助 –

1

你將不得不自己添加標籤。我同意Andres認爲lxml更適合於此,但使用HTMLParser,您可以創建一個TableParser類,該類輸出一個嵌套數組,其中包含每個表格行的字典。

import HTMLParser 
html = """<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>proxy-list</title> 
</head> 
    <body> 
     <table> 
      <tr> 
       <td>192.168.1.10</td>  
       <td>HTTP1</td> 
       <td>Vietnam</td> 
       <td>8080</td> 
       <td>a</td> 
       <td>%d1</td> 
      </tr> 
      <tr> 
       <td>10.25.100.10</td> 
       <td>HTTPS2</td> 
       <td>Campuchia</td> 
       <td>3214</td> 
       <td>b</td> 
       <td>%d2</td> 
      </tr>  
     </table> 
    </body> 
</html>""" 

class TableParser(HTMLParser.HTMLParser): 
    def __init__(self,tags): 
     self.tags=tags 
     HTMLParser.HTMLParser.__init__(self) 
     self.in_td = False 

    def handle_starttag(self, tag, attrs): 
     if tag == 'td':   
      self.in_td = True   
     if tag == 'tr': 
      self.count = 0 
      self.row = {} 

    def handle_data(self, data): 
     if self.in_td:   
      self.row[self.tags[self.count]] = data 
      self.count = self.count +1   

    def handle_endtag(self, tag): 
     self.in_td = False 
     if tag == 'tr': 
      self.table.append(self.row) 

    def feed_tags(self,html,tags): 
     self.table=[]  
     self.feed(html) 
     return self.table 

tags= ['ip','protocol','country','port','field1','field2'] 
p = TableParser(tags)  
table = p.feed_tags(html,tags) 
for row in table: 
    print row['ip']+','+row['protocol']+','+row['port'] 
+0

非常感謝 –

+0

Jaco:爲什麼?腳本只是得到一個數組最後是?幫我? –

+0

我不確定你在問什麼。我已經修改我的腳本來返回一個嵌套的數組,只是包含你想要的細節。 – Jaco