Извлечение ссылок на конкретные страницы из тега <a href с помощью BeautifulSoup - PullRequest
0 голосов
/ 11 ноября 2018

Я использую BeautifulSoup для извлечения всех ссылок с этой страницы: http://kern.humdrum.org/search?s=t&keyword=Haydn

Я получаю все эти ссылки следующим образом:

# -*- coding: utf-8 -*-

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'http://kern.humdrum.org/search?s=t&keyword=Haydn'

#opening up connecting, grabbing the page
uClient = uReq(my_url)

# put all the content in a variable
page_html = uClient.read()

#close the internet connection
uClient.close()

#It does my HTML parser
page_soup = soup(page_html, "html.parser")

# Grab all of the links
containers = page_soup.findAll('a', href=True)
#print(type(containers))

for container in containers:
    link = container
    #start_index = link.index('href="') 
    print(link)
    print("---")
    #print(start_index)

часть моего вывода: enter image description here

Обратите внимание, что он возвращает несколько ссылок, но я действительно хочу все ссылки с> Someting. (Например, «> Allegro» и «Allegro vivace» и т. Д.).

Мне трудно получить следующий тип вывода (пример изображения): "Аллегро - http://kern.ccarh.org/cgi-bin/ksdata?location=users/craig/classical/beethoven/piano/sonata&file=sonata01-1.krn&format=info"

Другими словами, на данный момент у меня есть несколько якорных тегов (+ - 1000). Из всех этих тегов есть куча, которые являются просто «мусором» и + - 350 тегов, которые я хотел бы извлечь. Все эти теги выглядят почти одинаково, но единственное отличие состоит в том, что нужные теги имеют в конце "> Somebody's name <\ a>". Я хотел бы извлечь только связь всех тегов привязки с этой характеристикой.

Ответы [ 4 ]

0 голосов
/ 11 ноября 2018

Вы хотите извлечь ссылку с указанным якорным текстом?

for container in containers:
    link = container
    # match exact
    #if 'Allegro di molto' == link.text:
    if 'Allegro' in link.text: # contain
        print(link)
        print("---")
0 голосов
/ 11 ноября 2018

Из того, что я вижу на изображении, те, у которых есть информация, имеют атрибут href, содержащий format="info", поэтому вы можете использовать CSS-селектор атрибута = значение [href*=format="info"], где * означает, что содержит ; значение атрибута содержит подстроку после первого равно.

import bs4 , requests

res = requests.get("http://kern.humdrum.org/search?s=t&keyword=Haydn")
soup = bs4.BeautifulSoup(res.text,"html.parser")
for link in soup.select('[href*=format="info"]'):
    print(link.getText(), link['href'])
0 голосов
/ 11 ноября 2018

Лучший и самый простой способ - использовать текстовый атрибут при печати ссылки. как это : print link.text

0 голосов
/ 11 ноября 2018

Предполагая, что у вас уже есть список подстрок, которые нужно найти, вы можете сделать что-то вроде:

for link in containers:
    text = link.get_text().lower()
    if any(text.endswith(substr) for substr in substring_list):
        print(link)
        print('---')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...