Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在xpath中找不到任何内容时,如何返回NA?_Html_R_Xpath_Web Scraping_Html Parsing - Fatal编程技术网

Html 在xpath中找不到任何内容时,如何返回NA?

Html 在xpath中找不到任何内容时,如何返回NA?,html,r,xpath,web-scraping,html-parsing,Html,R,Xpath,Web Scraping,Html Parsing,这个问题很难表述,但举个例子就很容易理解了 我使用R来解析html代码 在下面的代码中,我有一个名为html的html代码,然后我尝试提取//span[@class=“number”]中的所有值和//span[@class=“surface”]中的所有值: 曲面的输出为: [1] "Number 1" [1] "Surface 1" "Surface 2" 然后,当我尝试cbind这两个元素时,我不能,因为它们的长度不同 所以我的问题是:我能做什么来获得number的输出,即: [1] "N

这个问题很难表述,但举个例子就很容易理解了

我使用R来解析html代码

在下面的代码中,我有一个名为
html
的html代码,然后我尝试提取
//span[@class=“number”]
中的所有值和
//span[@class=“surface”]
中的所有值:

曲面的输出为:

[1] "Number 1"
[1] "Surface 1" "Surface 2"
然后,当我尝试
cbind
这两个元素时,我不能,因为它们的长度不同

所以我的问题是:我能做什么来获得
number
的输出,即:

[1] "Number 1" NA
然后我可以组合
数字
曲面

library( 'XML' )  # load library
doc = htmlParse( html )  # parse html
# define xpath expression. div contains class = line, within which span has classes number and surface
xpexpr <- '//div[ @class = "line" ]'  

a1 <- lapply( getNodeSet( doc, xpexpr ), function( x ) { # loop through nodeset
      y <- xmlSApply( x, xmlValue, trim = TRUE )  # get xmlvalue
      names(y) <- xmlApply( x, xmlAttrs ) # get xmlattributes and assign it as names to y
      y   # return y
    } )
数据:

html
数据:


html为每个标记选择封闭标记(此处为
div
)并查找其中的每个标记更容易。我觉得用rvest和purr更简单

库(rvest)
图书馆(purrr)
html%%>%已读\u html()%%>%
html_节点('.line')%>%
map_df(~list(number=.x%>%html_节点('.number')%%>%html_文本(),
surface=.x%>%html\u节点('.surface')%>%html\u文本())
#>#A tible:2×2
#>数字曲面
#>           
#>1号1面1
#>2表面2

为每个标签选择封闭标签(此处为
div
)并查找其中的每个标签更容易。我觉得用rvest和purr更简单

库(rvest)
图书馆(purrr)
html%%>%已读\u html()%%>%
html_节点('.line')%>%
map_df(~list(number=.x%>%html_节点('.number')%%>%html_文本(),
surface=.x%>%html\u节点('.surface')%>%html\u文本())
#>#A tible:2×2
#>数字曲面
#>           
#>1号1面1
#>2表面2

您是否试图确保数字和曲面对保持在一起?因为这个方法很容易混淆,比如说,如果第三行只有一个数字。然后两个列表都将返回两个元素,但它们不一定是成对的。您是否试图确保数字和曲面对保持在一起?因为这个方法很容易混淆,比如说,如果第三行只有一个数字。然后两个列表都将返回两个元素,但它们不一定是成对的。让我知道这是否适用于您,否则我将删除I@Sathish,谢谢您的回答,但我可能不够清楚,我想构建一个矩阵。但似乎我可以用你的解得到一个矩阵。。。请看alistaire的解决方案,谢谢让我知道这是否对你有效,否则我将删除ithi@Sathish,谢谢你的回答,但我可能不够清楚,我想构建一个矩阵。但似乎我可以用你的解得到一个矩阵。。。请看alistaire的解决方案,谢谢谢谢你alistaire,目前我不完全理解你的代码,但它可以工作。非常感谢。(
number=.x
表示number的xml值?)它使用CSS选择器而不是XPath,并且
map_df
lappy
一样迭代结果,但将结果简化为data.frame。这里我使用它简化的匿名函数语法,其中
.x
是为该迭代传递的值。好的,谢谢。我不熟悉CSS选择器。我简化了我的代码,如果我有
Number1
,我怎么才能得到
div
中的值呢?使用xPath,我可以执行
//span[@class=“number”]/div
,但等效的是
span.number div
。但是,如果您喜欢XPath,
html\u节点
html\u节点
也会接受它,如果您指定将其传递给
XPath
参数。您使用了CCS选择器,因为我有一个类值,对吗?如果我没有类值呢。例如,在我之前的评论中,我有一个代码
Number1
,如何获得div中的值的矩阵(在跨度内)?第1行将是1,第2行将是NA。谢谢alistaire,目前我不完全理解您的代码,但它可以工作。非常感谢。(
number=.x
表示number的xml值?)它使用CSS选择器而不是XPath,并且
map_df
lappy
一样迭代结果,但将结果简化为data.frame。这里我使用它简化的匿名函数语法,其中
.x
是为该迭代传递的值。好的,谢谢。我不熟悉CSS选择器。我简化了我的代码,如果我有
Number1
,我怎么才能得到
div
中的值呢?使用xPath,我可以执行
//span[@class=“number”]/div
,但等效的是
span.number div
。但是,如果您喜欢XPath,
html\u节点
html\u节点
也会接受它,如果您指定将其传递给
XPath
参数。您使用了CCS选择器,因为我有一个类值,对吗?如果我没有类值呢。例如,在我之前的评论中,我有一个代码
Number1
,如何获得div中的值的矩阵(在跨度内)?第1行为1,第2行为NA。
library( 'XML' )  # load library
doc = htmlParse( html )  # parse html
# define xpath expression. div contains class = line, within which span has classes number and surface
xpexpr <- '//div[ @class = "line" ]'  

a1 <- lapply( getNodeSet( doc, xpexpr ), function( x ) { # loop through nodeset
      y <- xmlSApply( x, xmlValue, trim = TRUE )  # get xmlvalue
      names(y) <- xmlApply( x, xmlAttrs ) # get xmlattributes and assign it as names to y
      y   # return y
    } )
nm <- c( 'number', 'surface' )
do.call( 'cbind', lapply( a1, function( x ) setNames( x[ nm ], nm ) ) )
#                [,1]        [,2]       
# number  "Number 1"  NA         
# surface "Surface 1" "Surface 2"
html <- '<div class="line">
<span class="number">Number 1</span>
<span class="surface">Surface 1</span>
</div>
<div class="line">
<span class="surface">Surface 2</span>
</div>'