我正在尝试提取包含一首阿拉伯诗的表格。您可以在here查看这首诗
我尝试解析表格...
URL <- "http://www.adab.com/modules.php?name=Sh3er&doWhat=shqas&qid=65546&r=&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']&//font[@class='poem']",xmlValue)
最佳答案
问题实际上是关于适当的选择器来获取具有“poem”类的多个标签。有几种选择。一个简单的选择是在 XPath 选择器中使用通配符 *
作为标记名称:
Poem <- xpathSApply(Data,"//*[@class='poem']",xmlValue)
如果您只需要 "poem"
类的 p
和 font
标签,但不需要,请使用 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
标记,请使用 "p.poem, font.poem"
。 Here's a fun tutorial on CSS selectors, if you like.
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] "الحان بالشهوات مصطخب" "حتى يكاد بهن ينهار" "و كأن مصاحبيه من ضرج"
关于html - 使用 xpathSApply 的相同代码搜索多个路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800039/