BeautifulSoup не показывает все элементы на сайте - PullRequest
0 голосов
/ 06 июня 2019

Я делаю парсер для сайта [https://edp.by/shop/womens-fragrances/][1] сначала я получил все ссылки с сайта для навигации по сайту

import requests
from bs4 import BeautifulSoup

def get_html(url):
    r = requests.get(url,'lxml')
    return r.text
url='https://edp.by/'
html=get_html(url)
soup=BeautifulSoup(html, )

x = soup.findAll("div", {"class": "row mainmenu"})
#print(x)
links=[]
for i in x:
    z=i.find_all("ul", {"class": "nav navbar-nav"})[0].find_all("a", {"class": "dropdown-toggle"})
    print(233,z,len(z),type(z))
    for i in z:
        q=i["href"]

        links.append(url+str(q))

затем я пытаюсь получить каждый продукт по ссылкам:

url='https://edp.by/shop/womens-fragrances/'
html=get_html(url)
soup=BeautifulSoup(html, )

#x = soup.findAll("div", {"class": "row"})
#print()
action = soup.find('form').get('action')
print(action)

и результат: /search/

но на веб-сайте я вижу всю структуру через анализатор кода Google

<form method="get" action="/shop/womens-fragrances/">
        <div class="rr-widget" data-rr-widget-category-id="594" data-rr-widget-id="516e7cba0d422d00402a14b4" data-rr-widget-width="100%"></div>
        <div class="shop_block">
          <div class="shop_table">
            <div class="col-md-4 col-sm-4 col-xs-12 product">
              <div class="block">
                <a href="/shop/womens-fragrances/43653/">
                  <img src="/images/no-image.png" class="text-center" alt="" title="">
                  <p class="fch"></p>
                  <p class="tch">0,00 руб. </p>
                </a>

Я хочу получить ссылку на продукт, изображениеи тексты, но bs4 не показывает это.В чем причина и как я могу получить это?Я попробовал также MechanicalSoup, без результата также

import mechanicalsoup


browser = mechanicalsoup.StatefulBrowser()
browser.open(links[0])
form = browser.select_form('form')
action = form.form.attrs['action']
print(action)       `/search/`

1 Ответ

1 голос
/ 06 июня 2019

.find() получит только первое появление этого тега. Есть 6 элементов с тегом <form>. Вы можете использовать .find_all(), а затем, пройдя через это, вы увидите, что это третья позиция индекса в этом списке:

import requests
from bs4 import BeautifulSoup

def get_html(url):
    r = requests.get(url,'lxml')
    return r.text
url='https://edp.by/'
html=get_html(url)
soup=BeautifulSoup(html, )

x = soup.findAll("div", {"class": "row mainmenu"})
#print(x)
links=[]
for i in x:
    z=i.find_all("ul", {"class": "nav navbar-nav"})[0].find_all("a", {"class": "dropdown-toggle"})
    print(233,z,len(z),type(z))
    for i in z:
        q=i["href"]

        links.append(url+str(q)) 


url='https://edp.by/shop/womens-fragrances/'
html=get_html(url)
soup=BeautifulSoup(html, 'html.parser')

#x = soup.findAll("div", {"class": "row"})
#print()
actions = soup.find_all('form')
for action in actions:
    alpha = action.get('action')
    print (alpha)

Выход:

/search/
/filter-ajax/
/filter-ajax/
/shop/womens-fragrances/
/shop/womens-fragrances/?lxml
/users/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...