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 Afrikamuseum in Tervuren vor den Toren Brüssels besucht, kom"| __truncated__ ...
paragraphs[1]
#> [1] "TERVUREN taz | Wer dieses Jahr Belgiens berühmtes Afrikamuseum 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
или .class2
. Вот отличный учебник , если вы хотите больше узнать о CSS-селекторах.
Когда необходимо создать экземпляр делегата, который имеет единственный параметр, лямбда-выражения позволяют, Вы для создания того делегата "встраиваете" очень кратким способом. Например, вот код для нахождения конкретного человека в списке их именем:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
В C# 2.0 Вы могли использовать анонимный метод, который был многоречив, но не слишком плохо:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
В C# 1.0 необходимо было бы создать целый дополнительный метод. Кроме того, если бы Вы хотели параметризовать его, то необходимо было бы создать другой тип, тогда как анонимные методы и лямбда-выражения получают свою среду выполнения (локальные переменные и т.д.), таким образом, они действуют как закрытия:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
Существует больше об этом в моей статье о закрытиях.
В то время как передача делегатов в методы не ужасно распространена в C# 2.0 и.NET 2.0, это - значительная часть основания LINQ - таким образом, Вы склонны использовать его много в C# 3.0 с.NET 3.5.
Это в основном расширяется до:
private string Lambda(object x) {
return x.ToString();
}
Действительно ли Вы знакомы с C# 2.0 анонимные методы? Эти два вызова эквивалентны (предположение, что SomeMethod принимает делегата и т.д.):
SomeMethod(x => x.ToString());
SomeMethod(delegate (SomeType x) { return x.ToString();});
Я знаю, который я ввел бы...