2015-09-23 3 views
4

Мне нужны только IP-адреса. Как отменить это. Мой код прямо сейчас-Возврат определенного содержания

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

x = urllib.request.urlopen('http://bannedhackersips.blogspot.com/2014_08_04_archive.html') 
soup = BeautifulSoup(x,"html.parser") 
data = soup.find_all("ul", {"class": "posts"}) 

for content in data: 
    print(content.text) 

Выход:

[Fail2Ban] SSH: banned 116.10.191.162 
[Fail2Ban] SSH: banned 116.10.191.204 
[Fail2Ban] SSH: banned 61.174.51.232 
[Fail2Ban] SSH: banned 61.174.51.224 
[Fail2Ban] SSH: banned 116.10.191.225 
[Fail2Ban] SSH: banned 200.162.47.130 
[Fail2Ban] SSH: banned 116.10.191.175 
[Fail2Ban] SSH: banned 61.174.51.223 
[Fail2Ban] SSH: banned 61.174.51.234 
[Fail2Ban] SSH: banned 61.174.51.209 
[Fail2Ban] SSH: banned 116.10.191.165 
[Fail2Ban] SSH: banned 106.240.247.220 

ответ

2

Вы можете извлечь из текста с регулярным выражением:

data = soup.find("ul", {"class": "posts"}) 

import re 

r = re.compile("\d+\.\d+\.\d+\.\d+") 

print(r.findall(data.text)) 
['116.10.191.162', '116.10.191.204', '61.174.51.232', '61.174.51.224', '116.10.191.225', '200.162.47.130', '116.10.191.175', '61.174.51.223', '61.174.51.234', '61.174.51.209', '116.10.191.165', '106.240.247.220'] 

Или как картина повторяется вы можете разделить на подстроки с splitlines и разделить один раз с конца каждой подстроки, чтобы извлечь ip:

data = soup.find("ul", {"class": "posts"}) 

ips = [line.rsplit(None, 1)[1] for line in data.text.splitlines() if line] 

print(ips) 
['116.10.191.162', '116.10.191.204', '61.174.51.232', '61.174.51.224', '116.10.191.225', '200.162.47.130', '116.10.191.175', '61.174.51.223', '61.174.51.234', '61.174.51.209', '116.10.191.165', '106.240.247.220'] 

На странице есть только один posts, так что найти достаточно, если вы перейдете за find_all, вы фактически перебираете один список элементов.

Смежные вопросы