Использование словаря для вырезания частей строк в списке

У меня есть длинный список, созданный с помощью Beautiful Soup в Python 3.

Прямо сейчас список формируется так..

mylist = [a['href'] for a in soup.find_all('a', href=True) if a.text] 

Это веб-скрапинг, но просто знайте, что он возвращает список.

И в виде списка он возвращает такие результаты:

'catalogue/category/books/travel_2/index.html',

'catalogue/category/books/mystery_3/index.html',

'catalogue/category/books/historical-fiction_4/index.html'

Прежде чем я напечатаю свой список, я хотел бы удалить различную бесполезную информацию (такую ​​как «каталог/», «категория/» и «книги/», чтобы отображалась только важная информация (путешествия, детективы или историческая фантастика).

Я смог успешно заменить одну вещь, используя:

mylist = [item.replace("catalogue/category/", "") for item in mylist]

Что отлично сработало. Но я не верю, что .replace будет принимать более 2 аргументов, поэтому я не могу удалить дополнительные вещи из моих результатов, такие как "index.html" . Я бы предпочел не писать эту строку для всего, что я хочу заменить. Вот почему я пытаюсь использовать ключи и значения из словаря в качестве аргументов .replace():

replacedict = {"catalogue/category/": "" , "index.html": ""}

mylist = [a['href'] for a in soup.find_all('a', href=True) if a.text]

def replace_all(mylist, replacedict):
     for k, v in replacedict.items():
         mylist = [item.replace(k, v) for item in mylist]
     return mylist

replace_all(mylist, replacedict)

print(mylist)

На данный момент программа не выдает никаких ошибок при запуске. Но это также просто НЕ делает то, о чем я прошу. Он просто возвращает большой список результатов, показанных выше, из которых ничего не удалено и не заменено.

Очень запутался, хотя уверен, что ответ прямо передо мной.

Ценю любую помощь, нигде не мог найти подобный вопрос.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы просто не получить интересующую вас часть каждого URL-адреса, разбив строку на список строк. Например.:

$ python
Python 3.7.2 (default, Dec 27 2018, 07:35:06) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> string_list = ['catalogue/category/books/travel_2/index.html', 'catalogue/category/books/mystery_3/index.html', 'catalogue/category/books/historical-fiction_4/index.html']
>>> array_list = [s.split('/') for s in string_list]
>>> array_list
[['catalogue', 'category', 'books', 'travel_2', 'index.html'], ['catalogue', 'category', 'books', 'mystery_3', 'index.html'], ['catalogue', 'category', 'books', 'historical-fiction_4', 'index.html']]
>>> [a[3] for a in array_list]
['travel_2', 'mystery_3', 'historical-fiction_4']

Это должно работать, если URL-адреса всегда структурированы так, как вы показали.

Ответ принят как подходящий

Как насчет использования регулярного выражения?

import re

my_list = ['catalogue/category/books/travel_2/index.html', 'catalogue/category/books/mystery_3/index.html', 'catalogue/category/books/historical-fiction_4/index.html']

REGEX = r'(catalogue/|category/|books/|_\d+/index.html)'

my_list = [re.sub(REGEX, '', string) for string in my_list]

print(my_list)

Выход:

['travel', 'mystery', 'historical-fiction']

Это сработало отлично. Любые советы по удалению _3 и _4? Предположим, что этот список огромен.

jonthesupreme 30.05.2019 03:42

Удалось удалить 3 и _4 с использованием: mylist = [i.split('')[0] для i из моего списка]

jonthesupreme 30.05.2019 03:52

@jonthesupreme Я обновил ответ, чтобы удалить суффиксы типа _3 без дополнительного обхода списка

dgumo 30.05.2019 20:41

Другие вопросы по теме