#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] "الحان بالشهوات مصطخب" "حتى يكاد بهن ينهار" "و كأن مصاحبيه من ضرج"