XPath:选择没有class属性的元素

Ale*_*aru 1 xml xpath r web-scraping

我正在尝试使用以下结构提取文本:

<p class="id1"> Title or something </p>    
<p> Text text text </p>
<p> More text </p>
<p class="id2"> Something else </p>
Run Code Online (Sandbox Code Playgroud)

我用的时候:

text_info <- xpathSApply(PARSED, "//p", xmlValue)
Run Code Online (Sandbox Code Playgroud)

结果是:

[1] 'Title or something'
[2] 'Text text text'
[3] 'More text'
[4] 'Something else'
Run Code Online (Sandbox Code Playgroud)

我只希望里面的文字<p>没有类:

[1] 'Text text text'
[2] 'More text'
Run Code Online (Sandbox Code Playgroud)

我使用以下代码,但它需要很长时间,我有很多文本:

text_info <- setdiff(xpathSApply(PARSED, "//p", xmlValue), xpathSApply(PARSED, "//p[@class]", xmlValue))
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用一个xpathSApply来提取那些没有类的人?

Ric*_*ven 6

您可以not()在XPath中使用.

xpathSApply(doc, "//p[not(@class)]", xmlValue, trim = TRUE)
# [1] "Text text text" "More text"   
Run Code Online (Sandbox Code Playgroud)

这会选择没有 class属性的元素.

数据:

library(XML)
doc <- htmlParse('<p class="id1"> Title or something </p>    
<p> Text text text </p>
<p> More text </p>
<p class="id2"> Something else </p>')
Run Code Online (Sandbox Code Playgroud)