首页 > 解决方案 > Python3 - 在写入文件之前过滤文本

问题描述

这是我的 main.py 脚本调用的函数。

这是问题所在,我有一个包含 IP 地址列表的文件,我查询此 API 以便找到我对 (url) 变量的那些给定 IP 的反向 DNS 查找。然后吐出“response.text”。

那么在 response.text 文件中,

我没有找到 96.xxx 的 DNS A 记录

我得到的其他数据只是一个 dnsname: 'subdomain.domain.com'

如何过滤我的结果以不显示每个“没有找到 DNS A 记录(无论显示什么)”

#!/usr/bin/env python3
import requests
import pdb
#function to use hackertarget api for reverse dns lookup
def dns_finder(file_of_ips="endpointslist"):
    print('\n\n########## Finding DNS Names ##########\n')
    targets = open("TARGETS","w")
    with open (file_of_ips) as f:
        for line in f:
            line.strip()
            url = 'https://api.hackertarget.com/reverseiplookup/?q=' + line
            response = requests.get(url)
            #pdb.set_trace()
            hits = response.text
            print(hits)
            targets.write(hits)
            return hits

标签: regexpython-3.xfiltering

解决方案


您可以使用该re模块检查响应以确保它是有效的 DNS 主机名(使用正则表达式模式):

import re

# ... rest of your code

# before writing to targets file
if re.match('^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$', hits) is not None:
    targets.write(hits)

如果给定的字符串与正则表达式匹配,该re.match()函数将返回一个匹配对象。否则,它将返回None。因此,如果您检查以确保它不是None,那么它应该与正则表达式匹配(即它与 DNS 主机名的模式匹配)。您可以更改正则表达式或将检查抽象为更通用的isValidHit(hit),并在其中放置您想要检查的任何功能,而不仅仅是 DNS 主机名。

笔记

你要小心你的线路targets = open("TARGETS","w")。这会打开文件进行写入,但您需要在其他地方手动关闭文件并处理与 IO 相关的任何错误。

with open(filename) as blah:每当处理文件 IO 时,您都应该尝试使用。它更安全,更易于维护。

编辑

在这里找到 IPv4 地址的简单正则表达式。

添加更多关于正则表达式match函数的解释。

编辑 2

我刚刚重新阅读了您的帖子,发现您实际上不是在寻找 IPv4 地址,而是在寻找 DNS 主机名......

在这种情况下,您可以简单地将正则表达式模式切换为^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$. DNS 主机名正则表达式的来源


推荐阅读