Извлечение href под тегом a - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь извлечь ссылку в разделе "a href =" link "..."

Поскольку есть несколько строк, я перебираю каждую из них.Мне нужна первая ссылка на строку, поэтому я использую find_all ('tr') и find ('a').Я знаю, что find ('a') возвращает Nontype, но не знаю, как обойти это

У меня был фрагмент кода, который работал, но неэффективно (в комментариях).

sauce = urllib.request.urlopen('https://morocco.observation.org/soortenlijst_wg_v3.php')
soup = bs.BeautifulSoup(sauce, 'lxml')

tabel = soup.find('table', {'class': 'tablesorter'})
for i in tabel.find_all('tr'):
#     if 'view' in i.get('href'):
#         link_list.append(i.get('href'))

    link = i.find('a')
#<a class="z1" href="/soort/view/164?from=1987-12-05&amp;to=2019-05-31">Common Reed Bunting - <em>Emberiza schoeniclus</em></a>     

Как мне получить ссылку в разделе href и обойти Nontype, получая только / soort / view / 164? С = 1987-12-05 & to = 2019-05-31?

Заранее спасибо

Ответы [ 2 ]

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

Логическим способом является использование nth-типа для выделения целевого столбца

import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://morocco.observation.org/soortenlijst_wg_v3.php')
soup = bs(r.content, 'lxml')
base = 'https://morocco.observation.org'
urls = [base + item['href'] for item in soup.select('#mytable_S td:nth-of-type(3) a')]

Вы также можете передать список классов

urls = [base + item['href'] for item in soup.select('.z1, .z2,.z3,.z4')]

Или даже использовать начинается с ^, оператор для class

urls = [base + item['href'] for item in soup.select('[class^=z]')]

Или содержит, *, оператор для href

urls = [base + item['href'] for item in soup.select('[href*=view]')]

Читайте о различных методах выбора CSS здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors

0 голосов
/ 31 мая 2019
link = i.find('a')
_href = link['href']
print(_href)

O / P:

"/soort/view/164?from=1987-12-05&to=2019-05-31?"

Это неправильная ссылка, вы должны указать имя домена

new_url = "https://morocco.observation.org"+_href
print(new_url)

O / P:

https://morocco.observation.org/soort/view/164?from=1987-12-05&to=2019-05-31?

Обновление:

from bs4 import BeautifulSoup
from bs4.element import Tag
import requests

resp = requests.get("https://morocco.observation.org/soortenlijst_wg_v3.php")
soup = BeautifulSoup(resp.text, 'lxml')
tabel = soup.find('table', {'class': 'tablesorter'})
base_url = "https://morocco.observation.org"

for i in tabel.find_all('tr'):
    link = i.find('a',href=True)
    if link is None or not isinstance(link,Tag):
        continue

    url = base_url + link['href']
    print(url)

O / P:

https://morocco.observation.org/soort/view/248?from=1975-05-05&to=2019-06-01
https://morocco.observation.org/soort/view/174?from=1989-12-15&to=2019-06-01
https://morocco.observation.org/soort/view/57?from=1975-05-05&to=2019-06-01
https://morocco.observation.org/soort/view/19278?from=1975-05-13&to=2019-06-01
https://morocco.observation.org/soort/view/56?from=1993-03-25&to=2019-06-01
https://morocco.observation.org/soort/view/1504?from=1979-05-25&to=2019-06-01
https://morocco.observation.org/soort/view/78394?from=1975-05-09&to=2019-06-01
https://morocco.observation.org/soort/view/164?from=1987-12-05&to=2019-06-01
...