2016-09-24 4 views
-3

Я столкнулся с стеной, почему этот код не работает, даже думал, что это тот же код, что и в онлайн-учебнике Python Web Scraping Tutorial 5 (Network Requests). Я попытался запустить код также через онлайн-интерпретатор Python.Веб-скребок с использованием regex

import urllib 
import re 

htmltext = urllib.urlopen("https://www.google.com/finance?q=AAPL") 

regex = '<span id="ref_[^.]*_l">(.+?)</span>' 
pattern = re.compile(regex) 
results = re.findall(pattern,htmltext) 
results 

я получаю:

re.pyc in findall(pattern, string, flags) 
175 
176  Empty matches are included in the result.""" 
--> 177  return _compile(pattern, flags).findall(string) 
178 
179 if sys.hexversion >= 0x02020000: 

TypeError: expected string or buffer 

Ожидаемый результат (ы):

112.71 

оцененная помощь. Я попытался использовать «read()» в URL-адресе, но это не сработало. Согласно документации, должны быть включены даже пустые результаты. Спасибо

+0

Существует ошибка в вашем шаблоне регулярного выражения правильный шаблон будет « (. +?) <\/span>' – ZdaR

+4

Если учебное пособие, которое вы используете, предлагает использовать регулярные выражения для очистки веб-страниц, найти другую; HTML-парсеры существуют по какой-то причине. – jonrsharpe

+0

@ZdaR ну нет ... '/' не требует экранирования в регулярных выражениях ... –

ответ

0

Проблема в том, что вы на самом деле не читали HTML из запроса.

htmltext = urllib.urlopen("https://www.google.com/finance?q=AAPL").read() 
+0

Умм ... ОП сказал * Я попытался использовать «read()» на url, но это не сработало * ... –

+1

Ну, они должны показать этот код; это работает для меня. И это определенно Python 2, так как 'urllib.urlopen' не существует в Python 3. –

+0

Правильно, поэтому я не получаю никакой ошибки, а вместо этого просто пустой результат ... которого я не должен, потому что шаблон происходит несколько раз на странице. – Smolo

0

Если следовать учебник до конца :):

% python2                          
>>> import urllib 
>>> data = urllib.urlopen('https://www.google.com/finance/getprices?q=AAPL&x=NASD&i=10&p=25m&f=c&auto=1').read() 
>>> print data.split()[-1] 
112.71 

Никогда не использовать регулярное выражение для веб царапать

я сделать улучшение для извлечения последнего элемента массива проще

+0

Спасибо, Джилл, но это другой URL-адрес, который вы открываете. Я продолжал следовать руководству до конца, но я до сих пор не понимаю, почему один и тот же фрагмент кода работает по-разному для разных людей/сред. Я ценю это! – Smolo

+0

Это URL-адрес, используемый в конце учебника –

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