Удаление текста из определенных HTML-элементов, из списка URL-адресов, в сочетании с регулярным выражением, а затем объединение их в файл .csv

#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")]')