Поиск нескольких путей с использованием одного и того же кода для xpathSApply

#html #r #xpath #html-parsing

#HTML #r #xpath #html-синтаксический анализ

Вопрос:

Я пытаюсь извлечь таблицу, содержащую арабское стихотворение. Вы можете проверить стихотворение здесь

Я попытался проанализировать таблицу…

 URL <- "http://www.adab.com/modules.php?name=Sh3eramp;doWhat=shqasamp;qid=65546amp;r=amp;rc=1"
Data <- htmlTreeParse(URL, useInternalNodes = TRUE,encoding = "Windows-1256")
Poem <- xpathSApply(Data,"//p[@class='poem']",xmlValue)
Poem1 <- xpathSApply(Data,"//font[@class='poem']",xmlValue)
Encoding(Poem) <- "UTF-8"
Encoding(Poem1) <- "UTF-8"
  

Но это нехорошо, потому что я изменил порядок, в котором было написано стихотворение.

Итак, есть ли способ получить эту таблицу, используя только один код, чтобы получить ее так, как написано в URL?

например:

  Poem <- xpathSApply(Data,"//p[@class='poem']amp;//font[@class='poem']",xmlValue)
  

Комментарии:

1. Вы можете использовать операторы XPath (которые вам, вероятно, понадобятся | ) или просто использовать подстановочный знак для тега, например "//*[@class='poem']" .

2. @alistaire Большое спасибо, я использовал подход с подстановочными знаками, и это сработало, не могли бы вы сделать это в качестве ответа? пожалуйста, два подхода.

Ответ №1:

На самом деле вопрос заключается в соответствующих селекторах для захвата нескольких тегов с классом «poem». Есть несколько вариантов. Простой вариант — использовать подстановочный знак * для имени тега в селекторе XPath:

 Poem <- xpathSApply(Data,"//*[@class='poem']",xmlValue)
  

Если вам нужны только p font теги класса и "poem" , но не, скажем div , тег того же класса, вы можете использовать | оператор (или) для выбора нескольких параметров. Переведено на rvest , который, как мне кажется, немного легче читать (хотя тот же селектор xpathSApply также отлично работает):

 library(rvest)

Poem <- URL %>% read_html() %>% 
    html_nodes(xpath = '//p[@class="poem"] | //font[@class="poem"]') %>% 
    html_text(trim = TRUE)
  

Другой вариант при использовании rvest — использовать селекторы CSS вместо селекторов XPath. В CSS класс задается с помощью . , поэтому все, что вам нужно для подстановочной версии ".poem" ; чтобы ограничить только p font тегами or, используйте "p.poem, font.poem" . Если хотите, вот забавный урок по селекторам CSS.

 Poem <- URL %>% read_html() %>% 
    html_nodes(css = '.poem') %>% 
    html_text(trim = TRUE)

head(Poem, 15)    # I don't speak Arabic, so check that the results make sense
##  [1] "أقداح و أحلام"             "أنا لا أزال و في يدي قدحي" "ياليل أين تفرق الشرب"     
##  [4] "ما زلت أشربها و أشربها"    "حتى ترنح أفقك الرحب"       "الشرق عُفر بالضباب فما"    
##  [7] "يبدو فأين سناك يا غرب؟"    "ما للنجوم غرقن ، من سأم"   "في ضوئهن و كادت الشهب ؟"  
## [10] "أنا لا أزال و في يدي قدحي" "ياليل أين تفرق الشرب ؟"    "******"                   
## [13] "الحان بالشهوات مصطخب"      "حتى يكاد بهن ينهار"        "و كأن مصاحبيه من ضرج"