Scrapy - удаление тегов html в выводе списка - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать небольшой скрипт, который будет извлекать теги 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

Есть идеи?

Спасибо!

Ответы [ 6 ]

0 голосов
/ 11 января 2019

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

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

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

0 голосов
/ 11 января 2019

Использование 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 голосов
/ 11 января 2019

Вы можете использовать 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 голосов
/ 11 января 2019
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 голосов
/ 11 января 2019

Чтобы получить заголовок и теги соответственно, вы можете попробовать следующий скрипт. Чтобы избавиться от вкладок и пробелов, вы должны использовать .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 голосов
/ 11 января 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...