Я предполагаю, что некоторые сайты используют прототип. DOM document.getElementsByClassName()
возвращает NodeList
, тогда как document.getElementsByClassName()
прототипа возвращает Array
, потому что NodeList
s не может быть создан JS-скриптами.
В Firefox вы можете использовать
var node = document;
Components.lookupMethod(node, 'getElementsByClassName').call(node, /* className */);
, чтобы получить исходный метод. Возможно, Google Chrome реализует нечто подобное, иначе вам не повезло. Я не мог найти ничего (2 мин. Googling).
В этом случае вы можете использовать что-то вроде этого:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
className = className.replace(/([\.\\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\$1');
var regex = new RegExp('(?:^|[\\n\\r ])' + className + '(?:[\\n\\r ]|$)');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(regex.test(nodeList[ i ].className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
Если Google Chrome реализует node.classList
, вы можете использовать следующая функция, которая не использует жуткое регулярное выражение:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(nodeList[ i ].classList.contains(className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
Эта функция выполняет итерацию по всем элементам внутри данного узла. Он возвращает Array как Prototype и имеет тот же недостаток: массивы не «живут», как NodeList
s.
Я наконец-то узнал, как это сделать с df.apply()
благодаря этому посту: Как применить функцию к двум столбцам Pandas dataframe
data_to_df.py
[ 110]wrangle_data.py
class WrangleData:
...
def regex_canaux(self, df):
if df['medium'] == "(NONE)":
return "Direct"
elif df['medium'] == "(NOT SET)":
return "BAR"
elif re.match("(.*)app_id=cpcg$", df['landingPage']):
return "SEA"
else:
return "FOO"
Затем после print(df.head())
я получил:
date medium sessions groupe_canaux
0 2019-02-25 (NONE) 11173 Direct
1 2019-02-25 (NOT SET) 12 BAR
2 2019-02-25 ABTESTING-HOME 126 FOO
3 2019-02-25 AFFILIATE 1 FOO
4 2019-02-25 ANNONCE 1 FOO