Как получить полную ссылку, используя BeautifulSoap - PullRequest
0 голосов
/ 02 июня 2019

Функция get("href") не возвращает полную ссылку. В html-файле существует ссылка:

enter image description here

Но функция link.get("href") return:

"navhome.php? & Лайтбокс dpxshig = / iprop_prod = 180-тонкий / типо = fotolivro / ширина = 950 / высота = 615 / контроль = истина / Tema = tema_02 / nome_tema = Q2wmYWFjdXRlO3NzaWNvIFByZXRv & cpmdsc = MOZAO"

sub_site = "https://www.fotoregistro.com.br/navhome.php?vitrine-produto-slim"

response = urllib.request.urlopen(sub_site)

data = response.read()

soup = BeautifulSoup(data,'lxml')
for link in soup.find_all('a'):

    url = link.get("href")
    print (url)  

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Используйте select и, кажется, печатаете отлично

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.fotoregistro.com.br/fotolivros/180-slim?cpmdsc=MOZAO')
soup = bs(r.content, 'lxml')
print([item['href'] for item in soup.select('.warp_lightbox')])

Используйте

print([item['href'] for item in soup.select('[href]')])

для всех ссылок.

0 голосов
/ 02 июня 2019

Позвольте мне сосредоточиться на конкретной части вашей проблемы в HTML:

<a class='warp_lightbox' title='Comprar' href='//www.fotoregistro.com.br/
navhome.php?lightbox&dpxshig=/iprop_prod=180-slim/tipo=fotolivro/width=950/height=615/control=true/tema=tema_02/nome_tema=Q2wmYWFjdXRlO3NzaWNvIFByZXRv&cpmdsc=MOZAO'><img src='
//sh.digipix.com.br/subhomes/_lojas_consumer/paginas/fotolivro/img/180slim/vitrine/classic_01_tb.jpg' alt='slim' />
                              </a>

Вы можете получить это, выполнив:

for link in soup.find_all('a', {'class':'warp_lightbox'}):
    url = link.get("href")
    break

вы обнаружите, что url:

'//www.fotoregistro.com.br/\rnavhome.php?lightbox&dpxshig=/iprop_prod=180-slim/tipo=fotolivro/width=950/height=615/control=true/tema=tema_02/nome_tema=Q2wmYWFjdXRlO3NzaWNvIFByZXRv&cpmdsc=MOZAO'

В начале строки можно увидеть два важных шаблона:

  • //, который является способом сохранения текущего протокола, см. this;
  • \r, что означает возврат каретки ASCII (CR).

Когда вы его печатаете, вы просто теряете эту часть:

//www.fotoregistro.com.br/\r

Если вам нужна необработанная строка, вы можете использовать repr в вашем for цикле:

print(repr(url))

, и вы получите:

//www.fotoregistro.com.br/\rnavhome.php?lightbox&dpxshig=/iprop_prod=180-slim/tipo=fotolivro/width=950/height=615/control=true/tema=tema_02/nome_tema=Q2wmYWFjdXRlO3NzaWNvIFByZXRv&cpmdsc=MOZAO

Есливам нужен путь, вы можете заменить начальную часть:

base = 'www.fotoregistro.com.br/'

for link in soup.find_all('a', {'class':'warp_lightbox'}):
    url = link.get("href").replace('//www.fotoregistro.com.br/\r',base)
    print(url)

и вы получите:

www.fotoregistro.com.br/navhome.php?lightbox&dpxshig=/iprop_prod=180-slim/tipo=fotolivro/width=950/height=615/control=true/tema=tema_02/nome_tema=Q2wmYWFjdXRlO3NzaWNvIFByZXRv&cpmdsc=MOZAO
www.fotoregistro.com.br/navhome.php?lightbox&dpxshig=/iprop_prod=180-slim/tipo=fotolivro/width=950/height=615/control=true/tema=tema_02/preview=true/nome_tema=Q2wmYWFjdXRlO3NzaWNvIFByZXRv&cpmdsc=MOZAO
.
.
.

Без указания класса:

for link in soup.find_all('a'):
    url = link.get("href")
    print(repr(url))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...