从网站HTMLParser Python获取数据

2024-10-03 13:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把这个网站分成三个部分,第一个是ipaddress,port和protoco,我用python中的HTMLParser来解决,但是下面的代码在一个标签中没有属性和值

<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>123</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.113</td> <td>HTTP5</td> <td>Itali</td> <td >505</td> <td>d</td> <td>%d4</td> </tr> <tr> <td>220.155.10.115</td> <td>HTTPS6</td> <td>Itali</td> <td >321</td> <td>d</td> <td>%d4</td> </tr> </table> </body> </html>

那么我如何得到所有的3个组件,IP地址和端口,protoco。在


Tags: 代码title网站porthtmltablebodyhead
2条回答

你必须自己添加标签。我同意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']

尝试使用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)

输出:

^{2}$

相关问题 更多 >