#python #csv #web-scraping #xpath #python-requests
Вопрос:
Мне нужно очистить все li
элементы, содержащие слово ПРОБЕЛ, независимо от регистра и знаков — мне нужно поймать «Пробел», «пробел», «пробел», «ПРОБЕЛ» и т. Д. Мне нужен весь текст внутри этих li
элементов, и у них есть несколько дополнительных тегов внутри, что оказалось проблематичным.
Вот пример одного из элементов, которые мне нужно очистить, внутри одной из страниц:
<li> The GAP Group, <span class="MathTeX">$GAP
lt;/span>
<script type="math/tex">GAP</script>
" groups, algorithms, and programming, version 4.4.12 (2008), http://www.gap-system.org. "
</li>
Вот как выглядит текст на странице — и это полный текст, который мне нужно очистить, но только его части выходят из-за дополнительных тегов внутриli
элемента:«Группа GAP, группы $GAP$, алгоритмы и программирование, версия 4.4.12 (2008), http://www.gap-system.org.»
Вот что я попробовал:
url_lst = ['some URLs'] for page3 in url_lst: page3 = requests.get(page3) tree3 = html.fromstring(page3.content) targets3 = tree3.xpath('//li[contains(text(), "gap")]') for target in targets3: print(target.text)
Вот отображаемый результат:
The GAP Group, GAP – groups, algorithms and programming, version 4.10, Available from http://www.gap-system.org, 2018. The GAP Group, (2008). (http://www.gap-system.org). The GAP Group, 2019. GAP – Groups, Algorithms, and Programming, Version 4.10.1; https://www.gap-system.org.
Он улавливает только некоторые из них, только те, которые содержат точно такое же слово, которое я поместил «пробел», и он частично улавливает те, у которых есть дополнительные теги внутри элемента li — он улавливает только часть, пока не достигнет первого дополнительного тега внутри — как я показываю вверху.
Я знаю, что мне нужно добавить регулярное выражение, чтобы игнорировать регистр, но я не знаю, как это сделать — это первая проблема. И еще большая проблема заключается в том, чтобы уловить весь текст в
li
элементе, включая текст в дополнительных тегах. И, наконец, мне нужно объединить все результаты в файл .csv, который я затем могу загрузить в pandas и продолжить анализ. Я не возражаю, если решение использует lxml, xpath или selenium bs4, если оно работает нормально. Спасибо вам за помощь, очень признателен.
Ответ №1:
Фильтр text() будет фильтровать только первый текстовый()-узел. Это ваш пример всего, что было раньше <span class="MathTeX">$GAP$</span>
.
Для фильтрации всего содержимого используйте .
И поскольку XPath 1.0 не имеет никаких функций регулярного выражения, вы можете использовать это:
targets3 = tree3.xpath('//li[contains(., "gap") or contains(.,"GAP")]')