Scrapy - удаление тегов html в выводе списка

1

Я пытаюсь написать небольшой скрипт, который будет извлекать теги steam игры и сохранять их в CSV файле. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что я не знаю, как удалить HTML-теги из моего вывода. Мой код ниже

from __future__ import absolute_import
import scrapy
from Example.items import SteamItem
from scrapy.selector import HtmlXPathSelector


class SteamSpider(scrapy.Spider):
    name = 'steamspider'
    allowed_domains = ['https://store.steampowered.com/app']
    start_urls = ["https://store.steampowered.com/app/578080/PLAYERUNKNOWNS_BATTLEGROUNDS/",]

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    tags = hxs.xpath('//*[@id="game_highlights"]/div[1]/div/div[4]/div/div[2]')
    for sel in tags:
        item = SteamItem()
        item['gametags'] = sel.xpath('.//a/text()').extract()
        item['gametitle'] = sel.xpath('//html/body/div[1]/div[7]/div[3]/div[1]/div[2]/div[2]/div[2]/div/div[3]/text()').extract()
    yield item

Мой предмет класса:

class SteamItem(scrapy.Item):
    #defining item fields
    url = scrapy.Field()
    gametitle = scrapy.Field()
    gametags = scrapy.Field()

Мой вывод выглядит так:

[u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tSurvival\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tShooter\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tMultiplayer\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tPvP\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tThird-Person Shooter\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tFPS\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tAction\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tBattle Royale\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tOnline Co-Op\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tTactical\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tCo-op\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tEarly Access\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tFirst-Person\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tViolent\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tStrategy\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tThird Person\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tCompetitive\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tTeam-Based\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tDifficult\t\t\t\t\t\t\t\t\t\t\t\t',
 u'\r\n\t\t\t\t\t\t\t\t\t\t\t\tSimulation\t\t\t\t\t\t\t\t\t\t\t\t'],

Моя цель - удалить все теги "u '\ r\n\t.....\t

Есть идеи?

Спасибо!

Теги:
web-scraping
scrapy

6 ответов

1
Лучший ответ

Чтобы получить заголовок и теги соответственно, вы можете попробовать следующий скрипт. Чтобы избавиться от вкладок и пробелов, вы должны использовать .strip() для .extract_first().

import scrapy

class SteamSpider(scrapy.Spider):
    name = 'steamspider'
    start_urls = ["https://store.steampowered.com/app/578080/PLAYERUNKNOWNS_BATTLEGROUNDS/",]

    def parse(self, response):
        title = response.xpath("//*[@class='apphub_AppName']/text()").extract_first().strip()
        tag_name = [item.strip() for item in response.xpath('//*[contains(@class,"popular_tags")]/*[@class="app_tag"]/text()').extract()]
        yield {"title":title,"tagname":tag_name}
  • 0
    В новом коде .get() может быть более питоновой альтернативой .extract_first() .
  • 0
    Столько недель пытались понять это ... Спасибо!
0

Просто используйте удаленный тег

import remove_tags
ToRemove = remove_tags(YourOutPut)
print(ToRemove)

Это решит вашу проблему

0

Использование strip() - один из способов сделать это. Однако, если вы хотите достичь этого целиком, используя XPath, взгляните на функцию normalize-space. В вашем случае просто измените извлечение значений на:

item['gametags'] = [a.xpath('normalize-space(.)').extract_first() for a in sel.xpath('.//a')]
item['gametitle'] = sel.xpath('normalize-space(//html/body/div[1]/div[7]/div[3]/div[1]/div[2]/div[2]/div[2]/div/div[3])').extract_first()
0

Вы можете использовать метод strip. Поскольку вы используете extract() который в конечном итоге вернет список, вы можете попробовать это.

item['gametags'] = list(map(str.strip, sel.xpath('.//a/text()').extract())
item['gametitle'] = list(map(str.strip, sel.xpath('//html/body/div[1]/div[7]/div[3]/div[1]/div[2]/div[2]/div[2]/div/div[3]/text()').extract())

Вы также можете следить за этой статьей в блоге для очистки паром.

0
item['gametags'] = sel.xpath('.//a/text()').extract()
item['gametitle'] = .xpath('//html/body/div[1]/div[7]/div[3]/div[1]/div[2]/div[2]/div[2]/div/div[3]/text()').extract()

strip ваши значения при извлечении как:

item['gametags'] = [val.strip() for val in sel.xpath('.//a/text()').extract()]

То же самое относится к вашему второму экстрактору :)

0

Первое, что нужно понять, это то, что вы пытаетесь удалить не "HTML-теги", а просто пробелы, большинство из которых в вашем случае являются символами табуляции с несколькими добавленными символами новой строки. Возможно, вы захотите переименовать вас вопрос, чтобы лучше выразить это.

Что касается удаления пробелов, библиотека HTML, которую вы используете, может обеспечить функцию для этого.

Если это не так, или в более общем случае этой проблемы, строки Python имеют метод strip (и некоторые отношения), который будет возвращать строку со всеми удаленными начальными и конечными пробелами. Таким образом, вы можете сделать что-то вроде:

item['field'] = sel.xpath('...').extract().strip()

Более подробная информация доступна в руководстве по Python: https://docs.python.org/2/library/string.html#string.strip

  • 0
    .extract () возвращает список, вы не можете применить strip () к списку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню