Получить HTML href ссылку, которая соответствует строке из списка строк с Beautiful Soup - PullRequest
3 голосов
/ 07 января 2020

Я пытаюсь получить URL-адрес со страницы, на которой есть список URL-адресов. Я не хочу получать все URL-адреса, только те, чей текст соответствует тексту строк в списке. Список строк - это подмножество текста ссылок на веб-странице, которое я извлек, удалив страницу и удалив ненужный мне текст. У меня есть список строк, хранящихся в filenames.

Я пытаюсь извлечь ссылки, содержащие строки в списке. Ниже возвращается пустой список

 r = requests.get(url)

    soup = BeautifulSoup(r.content, 'html5lib')

    links = soup.findAll('a', string = filenames[0])

    file_links = [link['href'] for link in links if "export" in link['href']]

Тег выглядит примерно так:

<p><a href="https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi">
                            ECZ Mathematics Paper 2 2019.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=1x_9E3PaviCuSsqfJqOsQKOwVlCWZ1jqf">
                            ECZ Mathematics Paper 1 2019.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp">
                            ECZ Science Paper 3 2009.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=0B0lFc6TrfIg7aENYc1V6akRVVnc">
                            ECZ Civic Education Paper 2 2009.</a></p>

Я хочу получить ссылки на href первых трех, но не последних, поскольку строка 'ECZ Civic Education Paper 2 2009.' не является частью моего списка строк. Ссылка на сайт здесь

Мой список строк выглядит следующим образом:


filenames = ['ECZ Mathematics Paper 2 2019.', 'ECZ Mathematics Paper 2 2019.',
             'ECZ Science Paper 3 2009.']

Я хочу только первые три ссылки, потому что текст ссылок находится в мой список (имена файлов). Я не хочу четвертую ссылку, потому что текст рядом со ссылкой href (ECZ Civi c Education Paper 2 2009.) отсутствует в моем списке, потому что я не хочу загружать этот файл.

Ответы [ 3 ]

1 голос
/ 07 января 2020

Попробуйте и посмотрите, работает ли он:

   html = """    
    <p><a href="https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi">
                                ECZ Mathematics Paper 2 2019.</a></p>    
    <p><a href="https://drive.google.com/uc?export=download&id=1x_9E3PaviCuSsqfJqOsQKOwVlCWZ1jqf">
                                ECZ Mathematics Paper 1 2019.</a></p>    
    <p><a href="https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp">
                                ECZ Science Paper 3 2009.</a></p>    
    <p><a href="https://drive.google.com/uc?export=download&id=0B0lFc6TrfIg7aENYc1V6akRVVnc">
                                ECZ Civic Education Paper 2 2009.</a></p>   
   """
    filenames = ['ECZ Mathematics Paper 2 2019.', 'ECZ Mathematics Paper 2 2019.',
                 'ECZ Science Paper 3 2009.']

    soup = bs(html, 'html5lib')

    all_links = soup.findAll('a')

    for link in all_links:           
        for nam in filenames:                
            if link.text.strip()==nam:
                print(link['href'])

Вывод:

https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi
https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi
https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp
1 голос
/ 07 января 2020

Вы можете создать CSS селектор, а затем выбрать ссылки в одном go. Например (html - ваш фрагмент кода из вопроса):

filenames = ['ECZ Mathematics Paper 1 2019.',
             'ECZ Mathematics Paper 2 2019.',
             'ECZ Science Paper 3 2009.']

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')

for a in soup.select(','.join('a:contains("{}")'.format(i) for i in filenames)):
    print(a['href'])

Отпечатки:

https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi
https://drive.google.com/uc?export=download&id=1x_9E3PaviCuSsqfJqOsQKOwVlCWZ1jqf
https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp
0 голосов
/ 07 января 2020

Если запрос был получен успешно. Затем просто проанализируйте его, используя bs, и найдите теги для ссылок "a", используя findAll. Я думаю, что нет необходимости передавать (string = filenames [0]) в findAll.

from bs4 import BeautifulSoup as bs
temp = """<p><a href="https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi">
                            ECZ Mathematics Paper 2 2019.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=1x_9E3PaviCuSsqfJqOsQKOwVlCWZ1jqf">
                            ECZ Mathematics Paper 1 2019.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp">
                            ECZ Science Paper 3 2009.</a></p>

<p><a href="https://drive.google.com/uc?export=download&id=0B0lFc6TrfIg7aENYc1V6akRVVnc">
                            ECZ Civic Education Paper 2 2009.</a></p>"""

soup =bs(temp, 'html5lib')
links = soup.findAll('a')
file_links = [link['href'] for link in links if "export" in link['href']]

Вывод:

['https://drive.google.com/uc?export=download&id=1wVjbdN9fztrjxhONGRX5U6N1OJDAChOi',
 'https://drive.google.com/uc?export=download&id=1x_9E3PaviCuSsqfJqOsQKOwVlCWZ1jqf',
 'https://drive.google.com/uc?export=download&id=1QFOzpPLuQPup8FtKgOoIcvzTnzCaRzUp',
 'https://drive.google.com/uc?export=download&id=0B0lFc6TrfIg7aENYc1V6akRVVnc']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...