2014-09-22 2 views
2

С этого сайта, http://www.lewisthomason.com/locations/ эта часть HTML кода имеет то, что я хочу извлечь, а именно, четыре города, в которых расположены офисы фирмы (Ноксвилл, Мемфис, Нэшвилл и Sevierville)XPath 1.0 выражение возвращает NULL

<div id="the_content"> 
<div class="one_fourth"> 
<h3> 
<cufon class="cufon cufon-canvas" alt="KNOXVILLE" style="width: 87px; height: 26px;"> 
<canvas width="104" height="25" style="width: 104px; height: 25px; top: -1px; left: 0px;"></canvas> 
<cufontext>KNOXVILLE</cufontext> 
</cufon> 
</h3> 
<p> 
<h6> 
</div> 
<div class="one_fourth"> 
<div class="one_fourth"> 
<div class="one_fourth last"> 
<div class="clearboth"></div> 
<p></p> 
</div> 
</div> 
<div id="secondary"> </div> 
<div class="clearboth"></div> 
</div> 

Я попытался несколько вариаций этих поисков XPath

require(XML) 
require(httr) 
doc <- content(GET('http://www.lewisthomason.com/locations/')) 

xpathSApply(doc, "//div[@id = 'the_content']/div//p", xmlValue, trim = TRUE) 
xpathSApply(doc, "//div[@class = 'one_fourth']//p", xmlValue, trim = TRUE) 

Все я получаю NULL. Какое выражение вернет названия городов или весь адрес? Я знаю, что четвертый город так меня пересмотрит.

Благодарим за любые рекомендации.

ответ

3

rvest на помощь с помощью CSS селекторов (XPath WLD работать, а) :

library(rvest) # for scraping 
library(httr) # only for user_agent() 

pg <- html_session("http://www.lewisthomason.com/locations/", 
        user_agent("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")) 

# get names 
pg %>% html_nodes("h3") %>% html_text() 

## [1] "KNOXVILLE" "MEMPHIS"  "NASHVILLE" "SEVIERVILLE" 

# get locations 
pg %>% html_nodes("h3~p") %>% html_text() %>% .[1:4] 

## [1] "One Centre Square, Fifth Floor\n620 Market Street\nPO Box 2425\nKnoxville, TN 37901\nPhone (865) 546-4646\nFax (865) 523-6529" 
## [2] "40 S Main St #2900\nMemphis, TN 38103\nPhone (901) 525-8721\nFax (901) 525-6722"            
## [3] "424 Church Street, Suite 2500\nPO Box 198615\nNashville, TN 37219\nPhone (615) 259-1366\nFax (615) 259-1389"     
## [4] "248 Bruce St, Suite 2\nSevierville, TN 37862\nPhone (865) 429-1999\nFax (865) 428-1612" 
+0

обертка для обертки к обертке;) – jdharrison

+0

Действительно :-) Хотя это должно сделать это намного проще для людей, чтобы получить данные, особенно с 'SelectorGadget' букмарклет Hadley включены в виньетке. Это прекрасно сочетается с целым, новым «причудливым» причудом. – hrbrmstr

+0

BTW rvest импортирует%>% от magrittr, так что вам не нужно dplyr – hadley

3

Веб-сайт проверяет для пользователя-агента. Он будет посылать вам правильное содержание, если вы даете ему соответствующий агент пользователя:

require(XML) 
require(RCurl) 
myAgent <- "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0" 
doc <- getURL('http://www.lewisthomason.com/locations/', useragent = myAgent) 
doc <- htmlParse(doc) 


> xpathSApply(doc, "//div[@id = 'the_content']/div//p", xmlValue, trim = TRUE) 
[1] "One Centre Square, Fifth Floor\n620 Market Street\nPO Box 2425\nKnoxville, TN 37901\nPhone (865) 546-4646\nFax (865) 523-6529" 
[2] "40 S Main St #2900\nMemphis, TN 38103\nPhone (901) 525-8721\nFax (901) 525-6722"            
[3] "424 Church Street, Suite 2500\nPO Box 198615\nNashville, TN 37219\nPhone (615) 259-1366\nFax (615) 259-1389"     
[4] "248 Bruce St, Suite 2\nSevierville, TN 37862\nPhone (865) 429-1999\nFax (865) 428-1612"          
[5] ""                                
> xpathSApply(doc, "//div[@class = 'one_fourth']//p", xmlValue, trim = TRUE) 
[1] "One Centre Square, Fifth Floor\n620 Market Street\nPO Box 2425\nKnoxville, TN 37901\nPhone (865) 546-4646\nFax (865) 523-6529" 
[2] "40 S Main St #2900\nMemphis, TN 38103\nPhone (901) 525-8721\nFax (901) 525-6722"            
[3] "424 Church Street, Suite 2500\nPO Box 198615\nNashville, TN 37219\nPhone (615) 259-1366\nFax (615) 259-1389" 

в противном случае он отправляет:

> getURL('http://www.lewisthomason.com/locations/') 
[1] "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don't have permission to access /locations/\non this server.</p>\n</body></html>\n" 
Смежные вопросы