【发布时间】:2015-11-20 17:18:22
【问题描述】:
我想这里一定有一个简单的答案,但我似乎找不到。
我正在抓取各种网页,我想从网页中拉下所有链接。我正在使用 htmlParse 来执行此操作,并且已经完成了大约 95%,但需要一些帮助。
这是我抓取网页的代码
MyURL <- "http://stackoverflow.com/"
MyPage <- htmlParse(MyURL) # Parse the web page
URLroot <- xmlRoot(MyPage) # Get root node
一旦我有了根节点,我就可以运行它来获取 a 节点
URL_Links <- xpathSApply(URLroot, "//a") # get all hrefs from root
这给了我这样的输出
[[724]]
<a href="//area51.stackexchange.com" title="proposing new sites in the Stack Exchange network">Area 51</a>
[[725]]
<a href="//careers.stackoverflow.com">Stack Overflow Careers</a>
[[726]]
<a href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license">cc by-sa 3.0</a>
或者,我可以运行它
URL_Links_values = xpathSApply(URLroot, "//a", xmlGetAttr, "href") # Get all href values
只获取这样的 HREF 值
[[721]]
[1] "http://creativecommons.org/licenses/by-sa/3.0/"
[[722]]
[1] "http://blog.stackoverflow.com/2009/06/attribution-required/"
但是,我正在寻找一种轻松获取 HREF 值和链接名称的方法,最好将其加载到数据框或矩阵中,而不是返回此值
<a href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license">cc by-sa 3.0</a>
<a href="http://blog.stackoverflow.com/2009/06/attribution-required/" rel="license">attribution required</a>
我明白了
Name HREF
1 cc by-sa 3.0 http://creativecommons.org/licenses/by-sa/3.0/
2 attribution required http://blog.stackoverflow.com/2009/06/attribution-required/
现在我可以获取 URL_Links 的输出并执行一些正则表达式或拆分字符串以获取此数据,但似乎应该使用 XML 包更简单的方法来执行此操作。
有没有简单的方法来做我想做的事?
编辑:
刚刚发现我可以这样做来获取 URL 名称
URL_Links_names <- xpathSApply(URLroot, "//a", xmlValue) # Get all href values
但是当我运行它时
df <- data.frame(URL_Links_names, URL_Links_values)
我收到此错误
Error in data.frame("//stackoverflow.com", "http://chat.stackoverflow.com", : arguments imply differing number of rows: 1, 0
我猜有没有名字的链接,那么对于任何没有名字的链接,我该如何让它 retrn "" 或 NA 呢?
【问题讨论】:
标签: r web-scraping html-parsing