xpathSApply不输出预期的元素

时间:2014-12-03 06:56:59

标签: xml r xpath httr

我花了很多时间试图弄清楚这个问题,但遗憾的是还没有运气。我希望有人能指出我正确的方向。

我试图提取下面脚本中提供的链接中列出的所有属性的地址元素。但是,输出始终为空列表。我尝试了不同的变化但没有效果。

lapply(c('XML','httr'),require,character.only=TRUE)
link <- "http://www.realtor.ca/Map.aspx?CultureId=1&ApplicationId=1&RecordsPerPage=9&MaximumResults=9&PropertyTypeId=300&TransactionTypeId=2&SortOrder=A&SortBy=1&LongitudeMin=-114.52066040039104&LongitudeMax=-113.60536193847697&LatitudeMin=50.94776904194829&LatitudeMax=51.14246522072541&PriceMin=0&PriceMax=0&BedRange=0-0&BathRange=0-0&ParkingSpaceRange=0-0&viewState=m&Longitude=-114.063011169434&Latitude=51.0452194213867&ZoomLevel=11&CurrentPage=1#CultureId=1&ApplicationId=1&RecordsPerPage=9&MaximumResults=9&PropertyTypeId=300&TransactionTypeId=2&SortOrder=A&SortBy=1&LongitudeMin=-114.9913558959965&LongitudeMax=-113.1346664428715&LatitudeMin=50.91552869934793&LatitudeMax=51.1745480567661&PriceMin=0&PriceMax=0&BedRange=0-0&BathRange=0-0&ParkingSpaceRange=0-0&viewState=l&Longitude=-114.063011169434&Latitude=51.0452194213867&ZoomLevel=11&CurrentPage=1"
doc <- htmlTreeParse(link,useInternalNodes = T)
addresses <- xpathSApply(doc,"//div[@id='listView']//span",xmlValue)

addresses的输出如下:

> addresses
list()

事实上,我无法获取上面链接中的任何其他html元素。我想知道它是否是因为页面加载需要一段时间,而GET{httr}htmlTreeParse{XML}会立即抓取网页,而不会让它首先完全加载。不确定我的推理是否有意义。我希望社群能够帮助解决这个问题。

2 个答案:

答案 0 :(得分:3)

该网站正在使用对POST的AJAX http://www.realtor.ca/api/Listing.svc/PropertySearch_Post调用来动态检索结果列表的数据。你需要做同样的事情来获取原始数据,然后从结果R列表结构中提取地址:

library(httr)

params <- list(CultureId=1,
               ApplicationId=1,
               RecordsPerPage=9,
               MaximumResults=9,
               PropertyTypeId=300,
               TransactionTypeId=2,
               SortOrder="A",
               SortBy=1,
               LongitudeMin="-114.9913558959965",
               LongitudeMax="-113.1346664428715",
               LatitudeMin="50.91552869934793",
               LatitudeMax="51.1745480567661",
               PriceMin=0,
               PriceMax=0,
               BedRange="0-0",
               BathRange="0-0",
               ParkingSpaceRange="0-0",
               viewState="l",
               Longitude="-114.063011169434",
               Latitude="51.0452194213867",
               ZoomLevel=11,
               CurrentPage=1)


pg <- POST("http://www.realtor.ca/api/Listing.svc/PropertySearch_Post",
           body=params, encode="form")

data <- content(pg)

sapply(data$Results, function(x) { x$Property$Address$AddressText })

## [1] "# 297 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A0W6"         
## [2] "# 298 6220 17 AV|Redcarpet Mountview, Calgary, Alberta T2A0W6"  
## [3] "10 VILLAGE WY|Westpark Village, Strathmore, Alberta T1P1A2"     
## [4] "51 Village WY|Downtown Strathmore, Strathmore, Alberta T1P1A2"  
## [5] "# 324 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"         
## [6] "# 345 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"         
## [7] "# 28 6724 17 AV SE|Redcarpet Mountview, Calgary, Alberta T2A0W5"
## [8] "# 328 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"         
## [9] "# 253 99 Arbour Lake RD NW|Arbour Lake, Calgary, Alberta T3G4E4"

警告刮刀

我不得不指出使用此代码违反了网站的copyright notice

  

本网站上的本数据库和所有资料受版权法保护,归CREA所有,或由提供数据的会员和/或其他第三方所有。本网站提供的房产列表和其他数据仅供个人私人非商业用途。除非事先拥有版权所有者的书面授权,否则明确禁止对该列表或数据进行全部或部分直接或间接的任何商业用途。

     

根据这些使用条款,用户可以打印或以其他方式保存个人页面以供私人使用。但是,财产清单和/或数据不得在任何方面进行修改或更改,与其他数据合并或以任何形式,全部或部分发布。禁止使用包括“屏幕抓取”,“数据库抓取”以及旨在收集,存储,重组或操纵CREA网站制作或显示的页面上的数据的任何其他活动。

并且使用此代码肯定会违反上述服务条款。

我只是提到它,因为像Realtor这样的组织。[com | ca]确实寻找所谓的抓取活动并将它们追溯到IP地址。

答案 1 :(得分:0)

我检查了你的代码:这是正确的。问题是您必须处理的HTML页面格式不正确。因此,xpath无法获取地址。

您可以控制此页面和/或生成方式。在这种情况下,你必须使其形成良好。

或者你不能。在这种情况下,您必须遵循另一种方法:将HTML代码页作为字符串加载,并使用子字符串或更好的正则表达式提取地址。