re.findall如何返回重复的匹配

时间:2011-06-09 19:53:26

标签: python findall

我有IP列表:PORT in html当我使用findall搜索所有ip时我得到的所有ip列表因为IP是唯一的,一些端口是相同的,我得到100个IP的示例列表,只有87个端口。如何找到重复的端口?

proxies = re.findall("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",html)

ports = re.findall("[0-9]{1,3}\,[0-9]{1,3}\,[0-9]{1,3}\,[0-9]{1,3}",html)
#ports are coded to looks like this 47,46,47,46

print len(proxies)
print len(ports)

2 个答案:

答案 0 :(得分:2)

如果没有看到源文件,我只能提出一些基本要点。

  • 端口号不限于3位数,因此您将排除任何超过999的端口
  • 端口号是否仅显示为4个端口的列表?您说格式是IP:PORT的列表,但这不是您要检查的内容。

修改

仔细查看页面的来源。有些条目没有4个端口号。

<tr>
    <td class="t_ip">151.9.233.6</td>
    <td class="t_port">50,42</td>
    <td class="t_country"><img src="/images/flags/it.png" alt="it" />Italy</td>
    <td class="t_anonymity">

            High

    </td>
    <td class="t_https">-</td>
    <td class="t_checked">00:02:16</td>
    <td class="t_check">
        <a href="" class="a_check" >check</a>
    </td>
</tr>

检查class="t_ip"class="t_port"并抓取该元素的内容似乎要容易得多。

<td class="t_ip">(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})</td>
<td class="t_port">((\d,?)+)</td>

注意: IP地址表达式将匹配无效的IP地址。

答案 1 :(得分:0)

不确定这会对您有多大帮助,但只是另一种选择:

txt = """
<tr>
    <td class="t_ip">151.9.233.6</td>
    <td class="t_port">50,42</td>
    <td class="t_country"><img src="/images/flags/it.png" alt="it" />Italy</td>
    <td class="t_anonymity">

            High

    </td>
    <td class="t_https">-</td>
    <td class="t_checked">00:02:16</td>
    <td class="t_check">
        <a href="" class="a_check" >check</a>
    </td>
</tr>    
"""

txt = [line.strip() for line in txt.split('\n')]

#clstaglen = len('</td>') => 5
getVals = lambda startTxt: [line[len(startTxt):len(line)-5] for line in txt if line.startswith(startTxt)]

print getVals('<td class="t_ip">')
print getVals('<td class="t_port">')