Невозможно получить href для этой конкретной страницы, используя красивый суп - PullRequest
0 голосов
/ 13 февраля 2019

Ниже приведен мой код:

# -*- coding: ascii -*-

# import libraries
from bs4 import BeautifulSoup
import urllib2
import re

def gethyperLinks(url):
    html_page = urllib2.urlopen(url)
    soup = BeautifulSoup(html_page, "html.parser")
    hyperlinks = []

    for link in soup.findAll('div', attrs={'class': 'ess-product-desc'}):
        hyperlinks.append(link.get('href'))

    return hyperlinks

print( gethyperLinks("http://biggestbook.com/ui/catalog.html#/search?cr=1&rs=12&st=BM&category=1") )

Я хочу указать следующий href:

<div 
    class="ess-product-desc" ng-hide="currentView == 'detail' `&amp;&amp; deviceType=='mobile'" 
    ui-sref="detail({itemId: 'BWK6400', uom: 'CT', cm_sp:'', merchPreference:''})" 
    href="#/itemDetail?`itemId=BWK6400&amp;uom=CT" aria-hidden="false">
        <span>Center-Pull Hand Towels, 2-Ply, Perforated, 7 7/8 x 10, White, 600/RL, 6 RL/CT</span>
</div>

Я хочу извлечь вышеупомянутый href, но я получаю [] в качестве финалаответ.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Значения для страницы требуют JavaScript для запуска.Это должно быть ясно, если вы проверяете ответ (по крайней мере, с запросами).Я показываю пример использования селена, чтобы у javascript было время для запуска.Вы можете преобразовать это в использование функции при возврате данных со страницы, на которую переходили во время сеанса очистки.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')

driver = webdriver.Chrome(chrome_options=chrome_options) 
driver.get("http://biggestbook.com/ui/catalog.html#/search?cr=1&rs=12&st=BM&category=1")
links = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ess-product-brand + [href]")))
results = [link.get_attribute('href') for link in links]
print(results)

Вызывается API с параметрами строки запроса, который возвращает данные в формате json.Вы должны передать реферер и токен.Если вы можете захватить токен или передать токен в сеансе (и он остается действительным) и можете расшифровать параметры строки запроса, то это может быть подходом, основанным на запросах.Не уверен насчет urllib.

https://api.essendant.com/digital/digitalservices/search/v1/search?cr=1&fc=1&listKey=I:D2F9CC81D2919D8712B61A3176A518622A2764B16287CA6576B9CF0C9B5&listKey=I:A81AAA8BD639792D923386B93AC32AC535673530AFBB7A25CAB5AB2E933EAD1&rs=12&st=BM&vc=n

0 голосов
/ 13 февраля 2019

Может быть, вы должны использовать «html5lib» вместо «html.parser», например:

from bs4 import BeautifulSoup
html="""
<div 
    class="ess-product-desc" ng-hide="currentView == 'detail' `&amp;&amp; deviceType=='mobile'" 
    ui-sref="detail({itemId: 'BWK6400', uom: 'CT', cm_sp:'', merchPreference:''})" 
    href="#/itemDetail?`itemId=BWK6400&amp;uom=CT" aria-hidden="false">
        <span>Center-Pull Hand Towels, 2-Ply, Perforated, 7 7/8 x 10, White, 600/RL, 6 RL/CT</span>
</div>
"""
soup = BeautifulSoup(html,"html5lib")
links = soup.findAll('div', attrs={'class': 'ess-product-desc'})
links[0].get("href")

вы получите:

'#/itemDetail?`itemId=BWK6400&uom=CT'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...