Веб-скрапинг в R атрибута, содержащего подстроку

Я использую пакет xml2 в R для очистки данных с веб-страницы. Текст, который я хочу очистить, заключен в теги, показанные ниже:

<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new 
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl01&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species A    
</a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl02&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species B   </a></td>
<td><a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl03&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Sepcies C    </a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl04&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species D</a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl05&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species E    </a></td>

Я попытался использовать следующие строки кода в R:

library(xml2)
page = read_html(website)
nodes = html_nodes(page, xpath='//td/a[@href*="javascript"]')

С помощью приведенного выше кода я просто хочу извлечь все узлы, у которых есть атрибут href, содержащий подстроку «javascript», но я получаю сообщение об ошибке ниже:

xmlXPathEval: evaluation failed
Warning message:
In xpath_search(x$node, x$doc, xpath = xpath, nsMap = ns, num_results = Inf) :
Invalid expression [1207]

Буду признателен, если у кого-нибудь есть предложения.

Спасибо всем за уделенное время.

Ваше здоровье.


person ProfLonghair    schedule 08.08.2016    source источник
comment
Вы привязаны к использованию xpath? В противном случае вы можете сделать: jscripts <- page %>% rvest::html_nodes('td') %>% rvest::html_nodes('a') %>% rvest::html_attr('href') %>% .[grepl('javascript', .)]. Вам нужно будет использовать пакет magrittr для оператора канала.   -  person Abdou    schedule 09.08.2016


Ответы (1)


Вы можете использовать contains в своем xpath, чтобы найти теги привязки, в которых href содержит интересующий вас текст:

library(xml2)
library(rvest)
website <- '<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new 
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl01&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species A    
</a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl02&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species B   </a></td>
<td><a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl03&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Sepcies C    </a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl04&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species D</a></td>
<td>
<a href="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(&quot;ctl00$CenterContent$ctl05&quot;,
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false,
true))">Species E    </a></td>'
page <- read_html(website)
nodes <- html_nodes(page, xpath='//td/a[contains(@href,"javascript")]')

> nodes
{xml_nodeset (5)}
[1] <a href="javascript:WebForm_DoPostBackWithOptions(new &#10;WebForm_PostBackOptions(&quot;ctl00$CenterConte ...
[2] <a href="javascript:WebForm_DoPostBackWithOptions(new&#10;WebForm_PostBackOptions(&quot;ctl00$CenterConten ...
[3] <a href="javascript:WebForm_DoPostBackWithOptions(new&#10;WebForm_PostBackOptions(&quot;ctl00$CenterConten ...
[4] <a href="javascript:WebForm_DoPostBackWithOptions(new&#10;WebForm_PostBackOptions(&quot;ctl00$CenterConten ...
[5] <a href="javascript:WebForm_DoPostBackWithOptions(new&#10;WebForm_PostBackOptions(&quot;ctl00$CenterConten ...
>
person jdharrison    schedule 08.08.2016