@henrick

Как правильно найти подстроку в строке?

Очень слабоват в Питоне, и не могу разобраться - почему код не работает ?
Суть такова - скачивается html-страничка, сохраняется на жесткий диск как текстовый файл, и потом уже в нем происходит поиск подстроки. Вся завтыка в том, что несмотря на то, что это слово есть в тексте, оно не находится.
0e6c6b4cbf16408cbf390be82844f727.PNG
Сначала я сделал так (ищется словосочетание Remote Temperature):
import urllib.request 
urlibp = 'qqq.www.eee.rrr/index.htm'   здесь указан ip-адрес - для вопроса он не важен
		
def get_data(url):
	remtemp = 0
	urllib.request.urlretrieve(url, filename = 'ibp.txt')   # 
	infile = open('ibp.txt', 'r') 
	lines = infile.readlines()
	for i in range(len(lines)): 
		line = lines[i]
		if 'Remote Temperature' in line:
			without_space = line[i+1].strip()
			remtemp = float(without_space[21:-27])     
		else:
			break
		infile.close()
	print (("Remote Temperature: ") + str(remtemp))
	
get_data(urlibp)

При запуске текстовый файл создается, но функция возвращает Remote Temperature: 0 - значение не поменялось.

Тогда решил попробовать метод find(), подправил код, чтобы найти индекс слова Remote:
import urllib.request 
urlibp = 'qqq.www.eee.rrr/index.htm'
urllib.request.urlretrieve(urlibp, filename = 'ibp.txt')   
infile = open('ibp.txt', 'r')  
lines = infile.readlines()
str1 = ' '.join(lines)
ind = str1.find('Remote')
print (str(ind))

В этом случае возвращается значение "-1", т. е. find не нашел "Remote". После этого меня и посетила мысль - правильно ли я действую ? Подскажите пожалуйста - где ошибка ?

ОС - Windows 7, Python 3.2
  • Вопрос задан
  • 553 просмотра
Решения вопроса 1
adugin
@adugin Куратор тега Python
Зачем сохранять в файл и потом с него читать? Вот простой пример с регуляркой:
import urllib, re

html = urllib.urlopen('http://www.mail.ru/').read()
pattern = '<span class="weather__temperature">([-+\d]+)</span>',
temperature = re.search(pattern, html).group(1)

print temperature
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@deliro
1) Парсить HTML нужно, как верно заметил Yuri Shikanov, BeautifulSoup'ом
2)
for i in range(len(lines)):
    line = lines[i]
- это не по-пайтоновски.
Разберись с итераторами и генераторами и замени на:
for line in lines:
    # line уже определена

3) Ошибка кроется, возможно, в том, что ты пытаешься найти строку в байтах. Опять же, используй BeautifulSoup.
Ответ написан
Комментировать
@jacob1237
Проверьте входные данные, а именно - что конкретно содержит переменная line.
Проблема может быть в том, что сервер отдает этот файл в сжатом с помощью gzip виде.
Если так, то urlretrieve не распаковывает gzip самостоятельно и Вам придется это делать вручную.
Ну и возможно что-то с кодировкой.

И для парсинга HTML я бы посоветовал lxml, а не BeautifulSoup, т.к. конкретно с Вашей задачей прекрасно можно справиться используя XPath, который в BeautifulSoup не поддерживается.

С XPath Ваша задача решается в несколько строк (XPath примерный, поэтому подгоните его под свой вариант):
import lxml.html

urlibp = 'qqq.www.eee.rrr/index.htm'

doc = lxml.html.parse(urlibp)
print doc.find("//td/b[.='Remote Temperature']/../following-sibling::td[1]/table/tr[1]/td[1]/b").text
Ответ написан
Комментировать
Может проблема с кодировкой? Проверьте, что выводит
print(str1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы