Использование словаря для вырезания частей строк в списке - PullRequest
2 голосов
/ 30 мая 2019

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

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

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

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

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

каталог / категория / книги / travel_2 / index.html ',

'каталог / категория / книги / mystery_3 / index.html',

каталог / категория / книги / историко-fiction_4 / index.html '

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

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

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

Который работал отлично. Но я не верю, что .replace будет принимать более двух аргументов, что не позволяет мне удалить из результатов дополнительные вещи, такие как «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)

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

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

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

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

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

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']
0 голосов
/ 30 мая 2019

Почему бы просто не получить часть каждого интересующего вас 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-адреса всегда структурированы так, как вы показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...