Если приветствуется сценарий пакетной обработки Python: я использовал BeautifulSoup для простого анализа заголовка из HTML, urllib для загрузки библиотек HTML и unicodecsv в порядке чтобы сохранить все символы из заголовка Youtube.
Единственное, что вам нужно сделать, это поместить csv с URL-адресом одного (именованного) столбца с URL-адресами видео Youtube в той же папке, что и скрипт, и назвать его yt-urls .csv и запустите скрипт. Вы получите файл yt-urls-title.csv , содержащий URL и его заголовки.
#!/usr/bin/python
from bs4 import BeautifulSoup
import urllib
import unicodecsv as csv
with open('yt-urls-titles.csv', 'wb') as f:
resultcsv = csv.DictWriter(f, delimiter=';', quotechar='"',fieldnames=['url','title'])
with open('yt-urls.csv', 'rb') as f:
inputcsv = csv.DictReader(f, delimiter=';', quotechar='"')
resultcsv.writeheader()
for row in inputcsv:
soup = BeautifulSoup(urllib.urlopen(row['url']).read(), "html.parser")
resultcsv.writerow({'url': row['url'],'title': soup.title.string})
Я не знаю другого «прямого» способа, кроме синтаксиса:
a.operator()<1>();
. Если вы готовы изменить код, можно переместить параметр шаблона в класс или использовать (boost | tr1) :: bind для создания объекта (boost | tr1) :: function.
Вы пытаетесь передать параметр шаблона экземпляру объекта, что, насколько мне известно, не разрешено. Вы можете передавать параметры шаблона только функциям шаблона или объектам шаблона.
a.test <1> (); и a.operator () <1> (); работают, потому что они служат функциями шаблонов.
Используйте boost :: bind (проверьте библиотеки boost), чтобы исправить это.
struct A {
void operator()(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A a;
boost::function<void()> f = boost::bind<void>(a, 1);
f(); // prints 1
return 0;
}
И вам даже не нужно возиться с шаблонами!
Вы можете вызвать только
a.operator()<1>();
, но без использования функтора. Функторам нужен не шаблонный оператор (), поскольку они должны иметь возможность вызываться как varname () , и это не будет работать с вашим кодом.
Чтобы сделать его настоящим функтором, измените свой код на шаблонный класс (функторы - это классы):
#include <iostream>
template<int N>
struct A {
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A<1> a;
a();
}
Вы застряли. Рассматривали ли вы что-то вроде
struct A {
template<int N>
struct B
{
void operator()()
{ std::cout << N << std::endl; }
};
template<int N>
B<N> functor() {return B<N>();}
};
int main()
{
A a;
a.functor<1>()();
}
Нет, выхода нет. Как вы сказали, вы должны либо вызвать оператор явно (что противоречит цели), либо аргументы шаблона должны быть выведены компилятором.