BeautifulSoup / Selenium: не удается найти div или какое-либо содержимое в теле - PullRequest
1 голос
/ 06 мая 2020

Моя цель - получить названия предметов (хлопковая рубашка) и цены (3600 ¥) внутри <div class="items-box-body">

<div class="items-box-body">
    <h3 class="items-box-name font-2">cotton shirt</h3>
    <div class="items-box-num">
       <div class="items-box-price font-5">¥3,600</div>
    </div>
</div>

Я использовал приведенный ниже код, но не смог получить доступ к любому div. Когда я тестировал soup.find_all(), я не видел никакого содержимого между body.

from bs4 import BeautifulSoup
from selenium import webdriver

options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=r'C:\Users\...', chrome_options=options)
soup = BeautifulSoup(driver.page_source, "html.parser")

site_url = 'https://www.mercari.com/jp/search/?sort_order=&keyword=&category_root=1&category_child=11&category_grand_child%5B122%5D=1&brand_name=&brand_id=&size_group=&price_min=&price_max=&item_condition_id%5B1%5D=1&shipping_payer_id%5B2%5D=1&status_on_sale=1'
response = driver.get(site_url)
time.sleep(5)

print(soup.html.unwrap())
>> <html></html>

test = soup.find_all()
print('1',test)
>> [<head></head>, <body></body>]

body = soup.body()
print('2',body)
>> 2 []

for item in soup.select('div[class*="default-container "]'):
    print('3', item)
>>

for item in soup.select('div[class*="items-box-body"]'):
    print('4', item)
>>

Что я сделал не так?

Для гиперссылки: https://www.mercari.com/jp/search/?...

1 Ответ

1 голос
/ 06 мая 2020

Узнать название продукта и цену. Вызовите WebDriverWait () и дождитесь, пока visibility_of_all_elements_located () загрузит элементы, а затем возьмите page_source для дальнейшей обработки.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from selenium import webdriver

site_url = 'https://www.mercari.com/jp/search/?sort_order=&keyword=&category_root=1&category_child=11&category_grand_child%5B122%5D=1&brand_name=&brand_id=&size_group=&price_min=&price_max=&item_condition_id%5B1%5D=1&shipping_payer_id%5B2%5D=1&status_on_sale=1'
driver.get(site_url)
WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,".items-box")))
html=driver.page_source
soup=BeautifulSoup(html,'html.parser')
for item in soup.select('.items-box'):
    print(item.find_next('h3',class_='items-box-name font-2').text.strip())
    print(item.find_next('div', class_='items-box-price font-5').text) 

Вы можете сделать это без селена, используя python модуль запросов.

from bs4 import BeautifulSoup
import requests

headers = {'User-Agent':
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
res=requests.get("https://www.mercari.com/jp/search/?sort_order=&keyword=&category_root=1&category_child=11&category_grand_child%5B122%5D=1&brand_name=&brand_id=&size_group=&price_min=&price_max=&item_condition_id%5B1%5D=1&shipping_payer_id%5B2%5D=1&status_on_sale=1",headers=headers).text
soup=BeautifulSoup(res,'html.parser')
for item in soup.select('.items-box'):
    print(item.find_next('h3',class_='items-box-name font-2').text.strip())
    print(item.find_next('div', class_='items-box-price font-5').text)
...