Как очистить элемент без атрибута ссылки или имени?

Привет, я действительно новичок в скрап-скрэпе. Я попробовал базовый код, но это один из уникальных способов, и я попробовал здесь другой подход. Как я могу получить количество лайков, любви и информации здесь https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/

вот мой код

<ul class="dark_postrating_outputlist">
<li>
<i class="fa fa-info-circle"></i> Informative x <strong>1</strong>
</li>
<li>
<i class="fa fa-thumbs-o-up"></i> Like x <strong>1</strong>
</li>
</ul>

Я хотел получить конкретный предмет внутри, я пробовал это

response.css('ul.dark_postrating_outputlist i.fa.fa-thumbs-o-up strong::text').extract_first()

Но это не работает, есть идеи, пожалуйста? благодарю вас


person Christian Read    schedule 22.04.2019    source источник
comment
что означает not working ? Покажите свой результат и какой результат вы ожидали.   -  person furas    schedule 22.04.2019
comment
Я пробую это на скрап-шелле, но он не показывает ни ошибок, ни результатов, просто пустых, или, если я поставлю extract(), он просто покажет []   -  person Christian Read    schedule 22.04.2019
comment
как насчет response.css('strong::text').extract() или response.css('ul.dark_postrating_outputlist strong::text').extract() Если вам нужно много результатов, не используйте extract_first()   -  person furas    schedule 22.04.2019
comment
ваша проблема <i> - <string> НЕ находится внутри <i>, поэтому не используйте i в css (вы можете получить два элемента, а затем использовать items[0] и items[1]) или использовать ~ как "i ~ strong"   -  person furas    schedule 22.04.2019


Ответы (3)


Попробуйте следующее, чтобы получить требуемый контент:

import scrapy

class TeslamotorsclubSpider(scrapy.Spider):
    name = "teslamotorsclub"
    start_urls = ["https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/"]

    def parse(self, response):
        for item in response.css("[id^='fc-post-']"):
            author = item.css(".author::text").get()
            like = item.css(".fa-thumbs-o-up + strong::text").get()
            love = item.css(".fa-heart-o + strong::text").get()
            informative = item.css(".fa-info-circle + strong::text").get()
            yield {"author":author,"like":like,"love":love,"informative":informative}

Частичный вывод:

{'author': 'Unpilot', 'like': '1', 'love': '4', 'informative': '1'}
{'author': 'UnknownSoldier', 'like': '7', 'love': '2', 'informative': '1'}
{'author': 'SpaceCash', 'like': '2', 'love': '15', 'informative': '2'}
{'author': 'gene', 'like': '45', 'love': '18', 'informative': '1'}
{'author': 'engle', 'like': '31', 'love': '5', 'informative': '15'}
{'author': 'Unpilot', 'like': '11', 'love': '3', 'informative': None}
{'author': 'SebastianR', 'like': '3', 'love': None, 'informative': None}
{'author': 'Buckminster', 'like': '1', 'love': '4', 'informative': None}
person SIM    schedule 22.04.2019
comment
Вау, спасибо @sim за твою помощь, ты только что дал все это - person Christian Read; 22.04.2019
comment
Привет @sim Я хотел очистить все элементы на странице, почему я получаю только 1 вывод? - person Christian Read; 22.04.2019
comment
Что вы имеете в виду под одним выходом? Я обновляю свой ответ несколькими результатами, которые у меня есть. - person SIM; 22.04.2019
comment
Спасибо, у меня просто неправильный отступ, даже интервал и отступ очень чувствительны, спасибо за помощь - person Christian Read; 22.04.2019

Вы можете добавить более конкретный селектор для разделения «лайков» и «информативных» данных. Проверьте этот пример:

>>> txt = """<ul class="dark_postrating_outputlist">
...  <li>
...  <i class="fa fa-info-circle"></i> Informative x <strong>1</strong>
...  </li>
...  <li> 
...  <i class="fa fa-thumbs-o-up"></i> Like x <strong>2</strong>
...  </li>
...  </ul>"""
>>> from scrapy import Selector
>>> sel = Selector(text=txt)
>>> sel.css('ul.dark_postrating_outputlist li:contains("Informative") strong::text').get()
u'1'
>>> sel.css('ul.dark_postrating_outputlist li:contains("Like") strong::text').get()
u'2'

Здесь вы можете получить свои номера отдельно.

person vezunchik    schedule 22.04.2019

Используйте XPath вместо CSS:

response.xpath('//ul[@class="dark_postrating_outputlist"]/li[//i[contains()"fa-thumbs-o-up"]]/strong/text()').get()
person Gallaecio    schedule 22.04.2019