У меня есть веб-сайт с большим количеством скрытых тегов в html. Я вставил исходный код ниже. Проблема состоит в том, что существует два типа скрытых тегов,
1.
Ones со style="display:none"
2.
У них есть список стилей, упомянутых в каждом теге td
.
И он изменяется с каждым тегом td. для примера ниже он имеет следующие стили,
hLcj{display:none} .J9pE{display:inline} .kUC-{display:none} .Dzkb{display:inline} .mXJU{display:none} .DZqk{display:inline} .rr9s{display:none} .nGF_{display:inline}
Таким образом, элементы с class=hLcj, kUC, mXJU, rr9s,etc
Являются скрытыми элементами
Я хочу извлечь текст всего tr, но исключить эти скрытые tags. Я часами царапаю голову и до сих пор не добился успеха.
Любая помощь приветствуется. Спасибо, я использую bs4
и python 2.7
.hLcj{display:none} .J9pE{display:inline} .kUC-{display:none} .Dzkb{display:inline} .mXJU{display:none} .DZqk{display:inline} .rr9s{display:none} .nGF_{display:inline} 35 121 199 . 116 116 200 . 86 86 120 134 134 151 151 154 . 36 157 157 249 249 7808
Использование seleniumа облегчит задачу, поскольку знает, какие элементы скрыты, а какие нет.
Но, в любом случае, вот базовый код, который вам, вероятно, нужно будет улучшить. Идея здесь состоит в том, чтобы разобрать тег style
и получить список исключаемых classов, иметь список тегов для исключения и проверять атрибут стиля каждого дочернего элемента в tr
:
import re from bs4 import BeautifulSoup data = """ your html here """ soup = BeautifulSoup(data) tr = soup.tr # get classes to exclude classes_to_exclude = [] for line in tr.style.text.split(): match = re.match(r'^\.(.*?)\{display:none\}', line) if match: classes_to_exclude.append(match.group(1)) tags_to_exclude = ['style', 'script'] texts = [] for item in tr.find_all(text=True): if item.parent.name in tags_to_exclude: continue class_ = item.parent.get('class') if class_ and class_[0] in classes_to_exclude: continue if item.parent.get('style') == 'display:none': continue texts.append(item) print ''.join(texts.strip())
Печать:
199.200.120.36
Также см: