2016-05-29 2 views
2

Я использую R лома веб-сайт, и при разборе HTML-код, у меня есть этот код ниже:Как определить узел с его значением XML в XPath?

<div class="line"> 
     <h2 class="clearfix"> 
      <span class="property">Number<div>number extra</div></span> 
      <span class="value">3</span> 
     </h2> 
    </div> 
    <div class="line"> 
     <h2 class="clearfix"> 
      <span class="property">Surface</span> 
      <span class="value">72</span> 
     </h2> 
    </div> 

Теперь я хотел бы получить некоторые значения в этом коде.

  • Как определить диапазон с величиной xml «Номер». и получить узел, чтобы извлечь «лишний номер»? Я знаю, как использовать xpathApply для идентификации узлов, чтобы получить xmlValue или некоторые атрибуты (например, href с xmlGetAttr). Но я не знаю, как определить узел, зная его значение xml.

    xpathApply(page, '//span[@class="property"]',xmlValue) 
    
  • Если я хочу, чтобы получить «значение» 72 для класса недвижимости «Surface», то, что является наиболее эффективным способом?

Вот я начал делать: Сначала я извлечь все "имущество":

xpathApply(page, '//span[@class="property"]',xmlValue) 

Затем извлечь все "значение":

xpathApply(page, '//span[@class="value"]',xmlValue) 

Тогда я построить список или матрицу, так что я могу идентифицировать значение «Поверхность», которое равно 72. Но проблема в том, что иногда диапазон с class="property" не может иметь диапазон с классом = «значение», который следует только в h2. Поэтому я не могу создать правильный список.

Может быть, это самый эффективный способ: определить промежуток с class="property", а затем определить h2, который содержит этот span, а затем определить span с class="value"?

+0

отблагодарить вы @kjhughes для редактирования –

ответ

1

Для вашего HTML сделаны, чтобы быть хорошо сформирован путем добавления одного корневого элемента,

<?xml version="1.0" encoding="UTF-8"?> 
<r> 
    <div class="line"> 
    <h2 class="clearfix"> 
     <span class="property">Number 
     <div>number extra</div> 
     </span> 
     <span class="value">3</span> 
    </h2> 
    </div> 
    <div class="line"> 
    <h2 class="clearfix"> 
     <span class="property">Surface</span> 
     <span class="value">72</span> 
    </h2> 
    </div> 
</r> 

(А) Это XPath-выражение,

//span[@class='property' and starts-with(., 'Number')]/div/text() 

возвратит

number extra 

в соответствии с запросом.


(В) Это выражение XPath,

//h2[span[@class='property' and . = 'Surface']]/span[@class='value']/text() 

возвратит

72 

в соответствии с просьбой.

+1

Большое спасибо @kjhughes –

1

XPath может оценивать содержимое тега, используя свою собственную функцию text().Использование rvest для простоты:

library(rvest) 

html <- '<div class="line"> 
     <h2 class="clearfix"> 
<span class="property">Number<div>number extra</div></span> 
<span class="value">3</span> 
</h2> 
</div> 
<div class="line"> 
<h2 class="clearfix"> 
<span class="property">Surface</span> 
<span class="value">72</span> 
</h2> 
</div>' 

html %>% read_html() %>% # read html 
    html_nodes(xpath = '//span[text()="Number"]/*') %>% # select node 
    html_text() # get text contents of node 
# [1] "number extra" 

XPath также имеет selectors to follow family axes, в этом случае following:::

html %>% read_html() %>% # read html 
    html_nodes(xpath = '//span[text()="Surface"]/following::*') %>% # select node 
    html_text() # get text contents of node 
# [1] "72" 
+0

Большое спасибо @alistaire –

+0

благодарственное вы снова за свой ответ. Я заметил, что 'follow ::' отлично работает, когда нет 'span' после. Что вы должны получить «3» в моем примере? который является «значением» номера. спасибо –

Смежные вопросы