In [1]:
import json
import re
import chardet
import requests
In [2]:
def get_text_from_html(url):
"""
获取网页内容,匹配有地址的文本
:param url: 获取地址的url
:return: 返回包含地址的网页内容
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
resp = requests.get(url, headers=headers)
content = resp.text
prefix_ip = 'var ip_result = '
for row in re.split('\\r\\n\\t', content):
if prefix_ip in row and row:
return row
In [3]:
ip = '180.97.125.228'
url = 'https://www.ip138.com/iplookup.asp?ip=%s&action=1' % ip
row = get_text_from_html(url)
row
Out [3]:
'\\t\\tvar ip_result = {"ASN¹éÊôµØ":"½\\xadËÕÊ¡ÄϾ©ÊÐ µçÐÅ ", "iP¶Î":"180.97.107.0 - 180.97.135.255", "¼æÈÝIPv6µØÖ·":"::B461:7DE4", "Ó³ÉäIPv6µØÖ·":"::FFFF:B461:7DE4", "ip_c_list":[{"begin":3026283264, "end":3026290687, "ct":"Öйú", "prov":"½\\xadËÕÊ¡", "city":"ÄϾ©ÊÐ", "area":"", "idc":"", "yunyin":"µçÐÅ", "net":""}], "zg":1};'
In [4]:
# 这个网页文字的编码是unicode形式的gbk编码内容
# Unicode codepoints U+0000 to U+00FF和latin-1一一对应,编码后保留了等价的字节流数据。
row_byte = row.encode("latin-1")
row_byte
Out [4]:
b'\\t\\tvar ip_result = {"ASN\\xb9\\xe9\\xca\\xf4\\xb5\\xd8":"\\xbd\\xad\\xcb\\xd5\\xca\\xa1\\xc4\\xcf\\xbe\\xa9\\xca\\xd0 \\xb5\\xe7\\xd0\\xc5 ", "iP\\xb6\\xce":"180.97.107.0 - 180.97.135.255", "\\xbc\\xe6\\xc8\\xddIPv6\\xb5\\xd8\\xd6\\xb7":"::B461:7DE4", "\\xd3\\xb3\\xc9\\xe4IPv6\\xb5\\xd8\\xd6\\xb7":"::FFFF:B461:7DE4", "ip_c_list":[{"begin":3026283264, "end":3026290687, "ct":"\\xd6\\xd0\\xb9\\xfa", "prov":"\\xbd\\xad\\xcb\\xd5\\xca\\xa1", "city":"\\xc4\\xcf\\xbe\\xa9\\xca\\xd0", "area":"", "idc":"", "yunyin":"\\xb5\\xe7\\xd0\\xc5", "net":""}], "zg":1};'
In [5]:
# 通过字节码获取当前的编码为gb2312
encoding_detect = chardet.detect(row_byte)
encoding_detect
Out [5]:
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
In [6]:
# 因此对其进行解码即可还原最初的unicode字符。
row_target = row_byte.decode("gb2312")
row_target
Out [6]:
'\\t\\tvar ip_result = {"ASN归属地":"江苏省南京市 电信 ", "iP段":"180.97.107.0 - 180.97.135.255", "兼容IPv6地址":"::B461:7DE4", "映射IPv6地址":"::FFFF:B461:7DE4", "ip_c_list":[{"begin":3026283264, "end":3026290687, "ct":"中国", "prov":"江苏省", "city":"南京市", "area":"", "idc":"", "yunyin":"电信", "net":""}], "zg":1};'
In [7]:
# 截取文本,转化为规范的json字符串
json_str = row_target.strip().replace('var ip_result = ', '').replace(';', '')
json_str
Out [7]:
'{"ASN归属地":"江苏省南京市 电信 ", "iP段":"180.97.107.0 - 180.97.135.255", "兼容IPv6地址":"::B461:7DE4", "映射IPv6地址":"::FFFF:B461:7DE4", "ip_c_list":[{"begin":3026283264, "end":3026290687, "ct":"中国", "prov":"江苏省", "city":"南京市", "area":"", "idc":"", "yunyin":"电信", "net":""}], "zg":1}'
In [8]:
# 转化为python里面的数据格式:字典
location_dict = json.loads(json_str)
location_dict
Out [8]:
{'ASN归属地': '江苏省南京市 电信 ',
'iP段': '180.97.107.0 - 180.97.135.255',
'兼容IPv6地址': '::B461:7DE4',
'映射IPv6地址': '::FFFF:B461:7DE4',
'ip_c_list': [{'begin': 3026283264,
'end': 3026290687,
'ct': '中国',
'prov': '江苏省',
'city': '南京市',
'area': '',
'idc': '',
'yunyin': '电信',
'net': ''}],
'zg': 1}
In [9]:
# 获取中文地址
location = location_dict.get('ASN归属地', '').strip()
location
Out [9]:
'江苏省南京市 电信'
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
网页
+关注
关注
0文章
69浏览量
18877 -
地址
+关注
关注
1文章
31浏览量
10608 -
文本
+关注
关注
0文章
118浏览量
16922
发布评论请先 登录
相关推荐
SIM5320如何用AT指令查询SERVER自身IP地址?
想要用两个SIM5320模块之间点对点互传数据,现在已经实现把其中一个配置为Server,另一个配置为Client,但是不知道如何查询Server的IP地址,还望高人指点! 附手册上配置SERVER的指令如下:(里面缺少查询IP
发表于 04-03 21:43
请问长短地址如何互相查询?
本帖最后由 一只耳朵怪 于 2018-5-24 11:07 编辑
如题,请问TI大牛:1. 知道短地址Node ID如何查询IEEE ID?2. 知道IEEE ID 如何查询短地址
发表于 05-22 08:44
请问AD9850怎么用c语言进行正弦波表地址查询?
您好!理论:AD9850中相位寄存器的输出与频率控制字相加输入到正弦波表地址查询,实践:那我怎么用c语言进行AD9850正弦波表查询呢?
发表于 09-17 15:31
请问SIM5320如何用AT指令查询SERVER自身IP地址?
想要用两个SIM5320模块之间点对点互传数据,现在已经实现把其中一个配置为Server,另一个配置为Client,但是不知道如何查询Server的IP地址,还望高人指点!附手册上配置SERVER的指令如下:(里面缺少查询IP的
发表于 08-26 08:01
RISC-V MCU开发 (七):代码调试
窗口可以显示所有设置的断点位置,可以在此处使能或者删除段断点。 【内存窗口】Memory窗口可以用来查询不同地址的值,例如我们查询0x2000000,点击该窗口下绿色加号 ,在弹出的窗口输入要
发表于 10-09 11:03
如何查询uboot下载执行地址?
的 Uboot 映像:fip.bin、fip.s32请问:有什么我没有用这种方式设置的吗?问题二、查询uboot下载执行地址查看Uboot的下载和执行地址可参考7.3下载S32G中的Uboot镜像_烧录工具
发表于 03-24 07:46
Modbus从设备如何回应主机的消息及VB的小问题?
Modbus从设备如何回应主机的消息?就是如何主机发往从设备要求查询地址4001地址的数据,从设备如何获得那个数据呢?
用RTU模式传输,用VB的话如何控制3.5和1.5字符的间隔?
是个新手,请尽量说的详细点,拜托各位大虾了~
发表于 05-05 16:10
dns地址如何查询
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域
发表于 01-15 16:09
•1128次阅读
植入芯片发力 深圳犬只未植入芯片将被视为无证养犬
26日,深圳市城市管理和综合执法局公布了全市首批100家犬只芯片免费注射点,市民可在美丽深圳微信公众号上查询地址。2020年年底前,深圳将实现犬只芯片管理全覆盖。(据《深圳市犬只电子标签植入管理规定
评论