Использование регулярных выражений, чтобы найти что-то в середине href во время цикла - PullRequest
0 голосов
/ 11 сентября 2018

Для получения «дополнительного кредита» в классе для начинающих в Python, который я беру, я хотел извлечь данные из URL с помощью регулярных выражений.Я знаю, что есть и другие способы, которыми я мог бы это сделать, но моему регулярному выражению крайне нужна работа, поэтому ...

По заданному URL-адресу найдите x-ное вхождение href на странице и используйте егоссылка, чтобы перейти на уровень ниже.Промойте и повторяйте, пока я не найду нужную ссылку на странице на запрашиваемой глубине на сайте.

Я использую Python 3.7 и Beautiful Soup 4. В начале программы, после того, как вся уборка сделана, у меня есть:

starting_url = 'http://blah_blah_blah_by_Joe.html'
extracted_name = re.findall('(?<=by_)([a-zA-Z0-9]+)[^.html]*', starting_url)
selected_names.append(extracted_name)
# Just for testing purposes
print(selected_name)  [['Joe']]

Хм, немного странноне ожидал вложенного списка, но я знаю, как сгладить список, так что хорошо.Давайте продолжим.

Я пробираюсь через пару циклов, открывая каждый URL для следующего уровня, используя:

html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
tags = soup('a')

Продолжить обработку и в цикле, где программадолжен был найти нужную мне ссылку:

# Testing to check I have found the correct href
print(desired_link)  <a href="http://blah_blah_blah_by_Mary.html">blah 
    blah</a>
type(desired_link) bs4.element.tag

Правильная ссылка, но новый для меня «тип», а не то, что я могу использовать re.findall.Итак, больше исследований, и я обнаружил:

for link in soup.find_all('a') :
    tags = link.get('href')
    type(tags) str
    print(tags)
       http://blah_blah_blah_by_George.html 
       http://blah_blah_blah_by_Bill.html 
       http://blah_blah_blah_by_Mary.html
       etc.

Правильный тип, но когда я смотрю на то, что напечатано, я думаю, что я смотрю, может быть, только одна длинная строка?И мне нужен способ просто назначить третий href в строке переменной, которую я могу использовать в re.findall ('regex expression', required_link).

Время обратиться за помощью, я думаю.

И, пока мы находимся, есть идеи, почему я получаю вложенный список в первый раз, когда я использовал re.findall с регулярным выражением?

Пожалуйста, дайте мне знать, как улучшить этот вопростак что стало яснее, что я сделал и что я ищу (я ЗНАЮ, что вы, ребята, без меня об этом даже не спросите).

1 Ответ

0 голосов
/ 12 сентября 2018

Вы напечатали каждую ссылку на странице. Но каждый раз в тегах цикла содержится только один из них (вы можете вывести len(tags), чтобы легко его проверить).

Также я предлагаю заменить [a-zA-Z0-9]+ на \w+ - он будет ловить буквы, цифры и подчеркивания и будет намного чище.

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