Как получить цену из html-блока, обходящего тег <hr> - PullRequest
0 голосов
/ 30 июня 2018

Я использую Python с BeautifulSoup.

У меня есть страница с несколькими этими HTML-блоками:

<div class="col-sm-6 col-md-3"> <div class="thumbnail box-hover thumb-article-product"> <div class="ProductPicWrapper"> <div class="test"> <a href="product_info.php?products_id=5055856419716"><img width="120" height="120" src="https://cdn.smartoys.be/catalog/images/thumbs/120_120/products/x5055856419716.JPG.pagespeed.ic.uX1UW7-Gxw.webp" title="The Elder Scrolls Online : Summerset" alt="The Elder Scrolls Online : Summerset" class="img-responsive" data-pagespeed-url-hash="3637984103" onload="pagespeed.CriticalImages.checkImageForCriticality(this);"/></a> </div> </div> <div class="caption"> <p class="text-center nameart"><a href="product_info.php?products_id=5055856419716">The Elder Scrolls Online : Summerset</a></p> <p class="group inner list-group-item-heading nameart-ean text-center">5055856419716</br>Playstation 4</p> <hr> <p class="text-center article-price article-price-used ">Dès <span itemprop="price">10<span class="product-price-sm">.00&euro;</span></span></p> <p class="text-center"> <span class="label"></span> </p> <div class="text-center"> <div class="btn-group"> <a href="product_info.php?products_id=5055856419716" class="btn btn-danger" role="button">Voir le produit</a> </div> </div> </div> </div></div>

Я хотел бы получить цену. Мне удалось сделать это со страницы, которую я локально сохранил из Chrome, но HTML-код сильно отличается при прямом подключении.

На загруженной странице я просто сделал следующее, чтобы узнать цену (для простоты вынул петли):

productblocks = soup.find_all("div",{"class": "col-sm-6 col-md-3"})
gameprice = productblocks[i].find("p", {"class": "text-center article-price article-price-used "}).text.encode('utf-8').strip()[:-3].replace('Dès ','')

Однако, когда вы делаете это с онлайн-страницей, следующий код не включает ценовой раздел:

productblocks = soup.find_all("div",{"class": "col-sm-6 col-md-3"})

Мне удалось получить имя, код и т. Д. Однако, похоже, что ценовой раздел отсутствует.

print productblocks[0]

возвращается:

<div class="col-sm-6 col-md-3"> <div class="thumbnail box-hover thumb-article-product"> <div class="ProductPicWrapper"> <div class="test"> <a href="product_info.php?products_id=5055856419716"><img alt="The Elder Scrolls Online : Summerset" class="img-responsive" height="120" src="https://cdn.smartoys.be/catalog/images/thumbs/120_120/products/x5055856419716.JPG.pagespeed.ic.CdYmLZol8V.jpg" title="The Elder Scrolls Online : Summerset" width="120"/></a> </div> </div> <div class="caption"> <p class="text-center nameart"><a href="product_info.php?products_id=5055856419716">The Elder Scrolls Online : Summerset</a></p><p class="group inner list-group-item-heading nameart-ean text-center">5055856419716</p></div></div></div>

который явно отсутствует в ценовом разделе. Что я делаю не так?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Есть более простые способы (a содержит ваш HTML):

import re
re.findall( r'span itemprop="price">(\d+)<span', a )
['10']
0 голосов
/ 30 июня 2018

Beautiful Soup не может выполнить синтаксический анализ после тега hr в вашем html. Вы можете попробовать это, чтобы получить значение цены.

Демо:

from bs4 import BeautifulSoup
s = """<div class="col-sm-6 col-md-3"> <div class="thumbnail box-hover thumb-article-product"> <div class="ProductPicWrapper"> <div class="test"> <a href="product_info.php?products_id=5055856419716"><img width="120" height="120" src="https://cdn.smartoys.be/catalog/images/thumbs/120_120/products/x5055856419716.JPG.pagespeed.ic.uX1UW7-Gxw.webp" title="The Elder Scrolls Online : Summerset" alt="The Elder Scrolls Online : Summerset" class="img-responsive" data-pagespeed-url-hash="3637984103" onload="pagespeed.CriticalImages.checkImageForCriticality(this);"/></a> </div> </div> <div class="caption"> <p class="text-center nameart"><a href="product_info.php?products_id=5055856419716">The Elder Scrolls Online : Summerset</a></p> <p class="group inner list-group-item-heading nameart-ean text-center">5055856419716</br>Playstation 4</p> <hr> <p class="text-center article-price article-price-used ">Dès <span itemprop="price">10<span class="product-price-sm">.00&euro;</span></span></p> <p class="text-center"> <span class="label"></span> </p> <div class="text-center"> <div class="btn-group"> <a href="product_info.php?products_id=5055856419716" class="btn btn-danger" role="button">Voir le produit</a> </div> </div> </div> </div></div>"""

soup = BeautifulSoup(s, "html.parser")
productblocks = soup.find_all("div",{"class": "col-sm-6 col-md-3"})
print( productblocks[0].find("p", class_="group inner list-group-item-heading nameart-ean text-center").findNext("p").text.encode('utf-8').strip()[:-3].replace('Dès ','') )

Выход:

10.00
  • Найдите тег p перед hr, а затем используйте findNext("p"), чтобы получить цену.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...