2014-01-30 3 views
0

Я пытающиеся собрать данные о индекса стоимости жизни для всех городов в Техасе с сайта ниже: http://www.city-data.com/city/Texas.htmlскребковые данные из нескольких ссылок на веб-странице

Что бы самый простой способ, чтобы очистить данные из веб-страница? Я пробовал использовать расширение Chrome под названием Web Scraper, но не был успешным. Я думаю, что это может улучшить работу с R, используя пакет XML или попробовать Scrapy. Я поднял оба подхода, но несколько потерял и искал какое-то направление. Любой вход был бы полезен.

ответ

1

Вы можете использовать BeautifulSoup4 (bs4) для разбора и чтения HTML-данных. Пожалуйста, посмотрите на этот пример:

In [4]: from urllib2 import urlopen 

In [5]: citylinkpage = urlopen("http://www.city-data.com/city/Texas.html") 

In [7]: from bs4 import BeautifulSoup as BS 

In [8]: soup = BS(citylinkpage) 

In [9]: allImportantLinks = soup.select('table.cityTAB td.ph a') 

In [10]: print allImportantLinks[:10] 
[<a href='javascript:l("Abbott");'>Abbott</a>, <a href='javascript:l("Abernathy");'>Abernathy</a>, <a href="Abilene-Texas.html">Abilene, TX</a>, <a href="Addison-Texas.html">Addison, TX</a>, <a href="Alamo-Heights-Texas.html">Alamo Heights</a>, <a href='javascript:l("Albany");'>Albany, TX</a>, <a href="Alice-Texas.html">Alice</a>, <a href="Allen-Texas.html">Allen, TX</a>, <a href='javascript:l("Alma");'>Alma, TX</a>, <a href="Alpine-Texas.html">Alpine, TX</a>] 

In [14]: allCityUrls = ["http://www.city-data.com/city/"+a.get('href') for a in allImportantLinks if not a.get('href').startswith('javascript:')] 

In [15]: allCityUrls 
Out[15]: 
['http://www.city-data.com/city/Abilene-Texas.html', 
'http://www.city-data.com/city/Addison-Texas.html', 
'http://www.city-data.com/city/Alamo-Heights-Texas.html', 
'http://www.city-data.com/city/Alice-Texas.html', 
'http://www.city-data.com/city/Allen-Texas.html', 
'http://www.city-data.com/city/Alpine-Texas.html', 
'http://www.city-data.com/city/Amarillo-Texas.html', 
... 

Поскольку страница каждого города, кажется, плохо HTML (особенно вокруг этого показателя), кажется, лучше искать страницу с помощью регулярных выражений (с использованием встроенного re - модуль)

cityPageAdress = "http://www.city-data.com/city/Abilene-Texas.html" 
pageSourceCode = urlopen(cityPageAdress).read() 
import re 
expr = re.compile(r"cost of living index in .*?:</b>\s*(\d+(\.\d+)?)\s*<b>") 
print expr.findall(pageSourceCode)[0][0] 
Out: 83.5 
+0

Что означает #pageSourceCode = ... со ссылкой на второй бит кода? Я не смог запустить этот кусок кода. – stochasticcrap

+0

@ user2566591 Это исходный код веб-страницы города ... Я добавляю что-то ... – koffein

+0

Есть ли способ предотвратить сбой веб-сайта при запуске кода? Я попробовал запустить код с списком url, разделенным на 400, но он по-прежнему падает. Есть идеи? error: urllib2.URLError: stochasticcrap

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