根据特定模式抓取多个段落

时间:2019-01-19 21:52:11

标签: r xpath web-scraping html-parsing rvest

该报纸网站在单独的<p>对象中列出了文章的段落,其中每个<class>属性的名称都以单词 article 开头。

如何从tz2对象中获取<class>属性以 article 开头的所有段落?

require(rvest)

url = 'http://taz.de/Kongo-Kunst-im-Bruesseler-Afrikamuseum/!5563620/'

tz = read_html(url)

tz2 = tz %>% 
  xml_nodes(xpath = "//*[@class='sectbody']") %>% 
  xml_children()

我的尝试:

# get one paragraph by class attribute
tz2 %>% 
  xml_nodes(xpath = "//p[@class='article first odd Initial']") %>% 
  xml_text()

# regex-like get all 'article' paragraphs
tz2 %>% 
  xml_nodes(xpath = "//p[@starts-with(@class, 'article')]") %>% 
  xml_text()

1 个答案:

答案 0 :(得分:5)

CSS选择器比XPath简单。对于类,常规语法为tag.class,如果缺少某些内容,则它匹配所有内容,因此.article匹配具有类article的每个标记。选择器之间的空格表示寻找与第二个选择器匹配的第一部分的子代。所以:

library(rvest)

tz <- read_html('http://taz.de/Kongo-Kunst-im-Bruesseler-Afrikamuseum/!5563620/')

paragraphs <- tz %>% html_nodes('.sectbody p.article') %>% html_text()

str(paragraphs)
#>  chr [1:20] "TERVUREN taz | Wer dieses Jahr Belgiens berühmtes Afri­kamuseum in Tervuren vor den Toren Brüssels besucht, kom"| __truncated__ ...

paragraphs[1]
#> [1] "TERVUREN taz | Wer dieses Jahr Belgiens berühmtes Afri­kamuseum in Tervuren vor den Toren Brüssels besucht, kommt ins Staunen. Wo früher das Musée royal d’Afrique Centrale (MRAC) alte Kolonialsammlungen darbot, zelebriert heute das renovierte „Africa Museum“, wie es jetzt heißt, den Reichtum des Kongo mit all seinen hellen und dunklen Seiten."

请注意,因为HTML中的类之间用空格隔开,所以class="class1 class2"将匹配.class1.class2Here's a great tutorial,如果您想了解有关CSS选择器的更多信息。