Соскрести URL в Python - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь получить adidas shoe ссылку со страницы поиска, не могу понять, что я делаю не так.

Я пытался tags = soup.find("section", {"class": "productList"}).findAll("a") Не работает: (

Я также пытался напечатать все href, и нужной ссылки там нет: (

Так что я ожидаю напечатать это:

https://www.tennisexpress.com/adidas-mens-adizero-ubersonic-50-yrs-ltd-tennis-shoes-off-white-and-signal-blue-62138


from bs4 import BeautifulSoup
import requests

url = "https://www.tennisexpress.com/search.cfm?searchKeyword=BB6892"

# Getting the webpage, creating a Response object.
response = requests.get(url)

# Extracting the source code of the page.
data = response.text

# Passing the source code to BeautifulSoup to create a BeautifulSoup object for it.
soup = BeautifulSoup(data, 'lxml')

# Extracting all the <a> tags into a list.
tags = soup.find("section", {"class": "productList"}).findAll("a")

# Extracting URLs from the attribute href in the <a> tags.
for tag in tags:
    print(tag.get('href'))

Вот HTML-код для этой ссылки

<section class="productList"> <article class="productListing"> <a class="product" href="//www.tennisexpress.com/adidas-mens-adizero-ubersonic-50-yrs-ltd-tennis-shoes-off-white-and-signal-blue-62138" title="Men`s Adizero Ubersonic 50 Yrs LTD Tennis Shoes Off White and Signal Blue" onmousedown="return nxt_repo.product_x('38698770','1');"> <span class="sale">SALE</span> <span class="image"> <img src="//www.tennisexpress.com/prodimages/78091-DEFAULT-m.jpg" alt="Men`s Adizero Ubersonic 50 Yrs LTD Tennis Shoes Off White and Signal Blue"> </span> <span class="brand"> Adidas </span> <span class="name"> Men`s Adizero Ubersonic 50 Yrs LTD Tennis Shoes Off White and Signal Blue </span> <span class="pricing"> <strong class="listPrice">$140.00</strong> <strong class="percentOff">0% OFF</strong> <strong class="salePrice">$139.95</strong> </span> <br> </a> </article> </section>

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Вот решение:

import requests
import bs4.BeautifulSoup as bs
url="https://www.tennisexpress.com/mens-adidas-tennis-shoes"
req = requests.get(url)
soup = bs(req.text,'lxml') # lxml because page is more xml than html
arts = soup.findAll("a",class_="product")

, и это дает вам список ссылок на все теннисные туфли adidas!Я уверен, что вы можете справиться оттуда.

0 голосов
/ 29 мая 2018

Изучив вкладку Сеть в Chrome DevTools, вы можете заметить, что продукты, которые вы ищете, выбираются после запроса на https://tennisexpress-com.ecomm-nav.com/search.js.Вы можете увидеть пример ответа здесь .Как видите, это беспорядок, поэтому я бы не стал следовать этому подходу.

В вашем коде вы не могли видеть продукты, потому что запрос сделан JavaScript (работает в вашем браузере) посленачальная загрузка страницы.Ни автономные urllib, ни requests не могут отображать этот контент.Однако вы можете сделать это с Requests-HTML, который поддерживает JavaScript (он использует Chromium за кулисами).

Код:

from itertools import chain
from requests_html import HTMLSession

session = HTMLSession()
url = 'https://www.tennisexpress.com/search.cfm?searchKeyword=adidas+boost'
r = session.get(url)
r.html.render()

links = list(chain(*[prod.absolute_links for prod in r.html.find('.product')]))

Я использовал chain, чтобы объединить все наборы с абсолютными ссылками, и создал из него список.

>>> links
['https://www.tennisexpress.com/adidas-mens-barricade-2018-boost-tennis-shoes-black-and-night-metallic-62110',
 'https://www.tennisexpress.com/adidas-mens-barricade-2018-boost-tennis-shoes-white-and-matte-silver-62109',
 ...
 'https://www.tennisexpress.com/adidas-mens-supernova-glide-7-running-shoes-black-and-white-41636',
 'https://www.tennisexpress.com/adidas-womens-adizero-boston-6-running-shoes-solar-yellow-and-midnight-gray-45268']

Не забудьте установить Requests-HTML с pip install requests-html.

0 голосов
/ 29 мая 2018
soup = BeautifulSoup(data, "html.parser")    
markup = soup.find_all("section", class_=["productList"])
markupContent = markup.get_text()

Итак, ваш код выглядит как

import urllib
from bs4 import BeautifulSoup
import requests

url = "https://www.tennisexpress.com/search.cfm?searchKeyword=BB6892"

r = urllib.urlopen(url).read()
soup = BeautifulSoup(r, "html.parser")
productMarkup = soup.find_all("section", class_=["productList"])
product = productMarkup.get_text()
...