Scrape表,排除具有特定类的行,并将属性值分配给每行的变量

时间:2015-06-04 04:26:14

标签: r xpath

我有一个包含以下HTML的页面。

<table id="batting_gamelogs">
 <tbody>
  <tr class id="batting_gamelogs.153">
   <td></td>
   <td></td>
   <td>
    <span id="PHA192504150-simmoal01">
   </td>
  </tr>
  <tr class id="batting_gamelogs.154">
   <td></td>
   <td></td>
   <td>
    <span id="PHA192504160-simmoal01">
   </td>
  </tr>
  <tr class ="thead">
   <td></td>
   <td></td>
   <td></td>
  </tr>
 </tbody>
</table>

我使用以下代码来刮表。

data = NULL
batlist = NULL

battingURLs <- paste("http://www.baseball- reference.com",yplist[,c("hrefs")],sep="")

for(thisbattingURL in battingURLs){

batting <- htmlParse(thisbattingURL)

fstampid <- regexpr("&", thisbattingURL, fixed=TRUE)-1
fstampyr <- regexpr("year=", thisbattingURL, fixed=TRUE)+5
id <- substr(thisbattingURL, 53, fstampid)
year <- substr(thisbattingURL, fstampyr, 75)

if (length(xpathSApply(batting, '//*[@id = "batting_gamelogs"]', xmlValue))==0) next

tableNode <- xpathSApply(batting, '//*[@id="batting_gamelogs"]')[[1]]
data <- readHTMLTable(tableNode, stringsAsFactors = FALSE)
data # select the first table
total <- cbind(id,year,data)

batlist <- bind_rows(batlist, total)

}

我想省去“thead”这一类的任何一行。我不知道是否更容易刮掉整个表格,然后删除不需要的行或者不首先抓住它们。我还想将span id分配给一个名为gameid的变量,用于表格中的每一行。

我用来擦桌子的代码一下子抓住了整张桌子,但是我不确定我是否是R的新手。我试过在这里搜索,但是我无法做头或者我找到的任何东西的尾巴。

当我使用一个URL测试并选择特定的tr类id时,我用来设置gameid的代码是有效的,但是当我使用contains时却没有。我不确定是不是因为我在一个循环中运行并立刻刮掉整个表格。

gameid <- xpathSApply(batting, '//*[@id="batting_gamelogs.153"]/td[10]/span/@id')

返回此“PHA192504150-simmoal01”,表格的每一行都会有所不同/唯一。

当我在循环中运行时,我正在尝试以下代码

gameid <- xpathSApply(batting, '//*[contains(., "batting_gamelogs."]/td[10]/span/@id')

从那里开始,我将使用代码末尾的其他变量来绑定gameid。我现在没有它,因为它不起作用。

感谢您的帮助,非常感谢!!

1 个答案:

答案 0 :(得分:0)

我能够通过修改像@ har07建议的代码并切换来从表中拉出gameid。到包含中的@id。

gameid <- xpathSApply(batting, '//*[contains(., "batting_gamelogs.")]/td[10]/span/@id')

现在看起来像

gameid <- xpathSApply(batting, '//*[contains(@id, "batting_gamelogs.")]/td[10]/span/@id')

我还能够通过对当前data.frame进行子集来排除行。我添加了这行代码来创建一个没有无用标题和misc行的新data.frame。

newdata <- subset(data, Rk!="April" & Rk!="May" & Rk!="June" & Rk!="July" & Rk!="August" & Rk!="September" & Rk!="October" & Rk!="November" & Opp!="<NA>")