Трудность соскоблить некоторые цены с сайта - PullRequest
0 голосов
/ 07 июня 2019

Попытка соскрести цены с веб-сайта, но некоторые цены вычеркнуты, и отображается новая цена, поэтому я получил нулевую цену для этих цен.Ну, я подумал, что мог бы создать оператор if, чтобы получить правильную цену, и это сработало.Но вместо получения новой цены я получаю перечеркнутую цену, потому что идентификаторы одинаковы для обоих.Любые идеи о том, как это исправить?Screenshot of HTML code html code of not corssed out price

  for game in response.css("tr[class^=deckdbbody]"):

            # Initialize saved_name to the extracted card name
            saved_name  = game.css("a.card_popup::text").extract_first() or saved_name
            # Now call item and set equal to saved_name and strip leading '\n' from output
            item["Card_Name"] = saved_name.strip()
            # Check to see if output is null, in the case that there are two different conditions for one card
            if item["Card_Name"] != None:
                # If not null than store value in saved_name
                saved_name = item["Card_Name"].strip()
            # If null then set null value to previous card name since if there is a null value you should have the same card name twice
            else:
                item["Card_Name"] = saved_name
            # Call item again in order to extract the condition, stock, and price using the corresponding html code from the website
            item["Condition"] = game.css("td[class^=deckdbbody].search_results_7 a::text").get()
            item["Stock"] = game.css("td[class^=deckdbbody].search_results_8::text").extract_first()
            item["Price"] = game.css("td[class^=deckdbbody].search_results_9::text").extract_first()
            if item["Price"] == None:
                item["Price"] = game.css("td[class^=deckdbbody].search_results_9 span::text").get()

            # Return values
            yield item

Ответы [ 2 ]

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

Вы должны очистить его, учитывая, что тег стиля style="text-decoration:line-through" предназначен для цен, которые вам не нужны.

Для этого вы можете использовать BeautifulSoup, а учитывая, что цены, которые не пересекаются, не имеют тега стиля:

from bs4 import BeautifulSoup as bs
import requests as r

response = r.get(url)
soup = bs(response.content)
decks = bs.find_all('td', {'class': 'deckdbbody', 'style': None})   

Теперь получите текстовое содержимое внутри каждого, которое является ценой:

prices = [d.getText().strip() for d in decks]

С вашим обновлением я вижу, что вы получите нежелательные вещи в списке prices, потому чтолот td использует этот класс и даже не является ценой; простой способ исправить это - проверить, есть ли у вас знак доллара в .getText():

final = []
for price in prices:
    if '$' in price:
        final.append(price)

Теперь final имеет толькочто вы действительно хотите.

0 голосов
/ 07 июня 2019

Вот что получилось

if item["Price"] == None:
    item["Price"] = game.css("td[class^=deckdbbody].search_results_9 span[style*='color:red']::text").get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...