XPaths с Scrapy и Python, не могут заставить XPath работать правильно

1

Я работаю с python и scrapy на прошлой неделе, используя следующий учебник: https://realpython.com/web-scraping-with-scrapy-and-mongodb/

То, что делает этот учебник, заключается в том, что он очищает верхние вопросы и их URL-адреса от stackoverflow с помощью поискового сканера, а затем хранит его в базе данных и коллекции mongoDB.

Я пытаюсь адаптировать то, что было сделано в учебнике, чтобы очистить и сохранить несколько элементов в нескольких коллекциях для одной и той же базы данных mongoDB, а затем экспортировать их в формате CSV. Я выяснил, как сделать большую часть из них, но я возникают проблемы с "xpaths", которые использует scrapy для поиска определенных элементов на веб-странице, чтобы быть более spesific. Я выяснил, как сделать pipleline для mongodb и хранить несколько коллекций, а также изменить имена коллекций на основе имя элемента, который очищается, но я не могу заставить "пауков" работать конкретно с xpaths, или, насколько мне известно, проблема кроется в неправильности xpaths.

У меня нет опыта работы с scrapy, и я провел дни исследований, пытаясь понять, как делать xpaths, но я не могу заставить его работать.

Страница, которую я пытаюсь очистить: /qaru.site/...

Паук для заголовков вопросов и URL-адресов, которые работают по назначению:

from scrapy import Spider
from scrapy.selector import Selector

from stack.items import QuestionItem

class QuestionSpider(Spider):
    name = "questions"
    allowed_domains = ["stackoverflow.com"]
    start_urls = [
        "http://stackoverflow.com/questions?pagesize=50&sort=newest",
    ]

    def parse(self, response):
        questions =     Selector(response).xpath('//div[@class="summary"]/h3')

        for question in questions:
            item = QuestionItem()
            item['title'] = question.xpath(
                'a[@class="question-hyperlink"]/text()').extract()[0]
            item['url'] = question.xpath(
                'a[@class="question-hyperlink"]/@href').extract()[0]
            yield item     

Паук для количества ответов, голосов и просмотров, которые не работают по назначению:

from scrapy import Spider
from scrapy.selector import Selector

from stack.items import PopularityItem

class PopularitySpider(Spider):
    name = "popularity"
    allowed_domains = ["stackoverflow.com"]
    start_urls = [
        "http://stackoverflow.com/questions?pagesize=50&sort=newest",
    ]

    def parse(self, response):
        popularity =     Selector(response).xpath('//div[@class="summary"]/h3')


        for poppart in popularity:
           item = PopularityItem()
           item['votes'] = poppart.xpath(
                'div[contains(@class, "votes")]/text()').extract()
           item['answers'] = poppart.xpath(
                'div[contains(@class, "answers")]/text()').extract()
           item['views'] = poppart.xpath(
                'div[contains(@class, "views")]/text()').extract()
           yield item

И, наконец, третий паук, который имеет аналогичные проблемы, как второй паук.

со вторым пауком я получаю следующий вывод и данные, хранящиеся в моей базе данных mongoDB после запуска паука:

scrapy crawl popularity

{ "_id" : ObjectId("5bbde11cb395bb1dc0d9410d"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9410e"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9410f"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94110"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94111"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94112"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94113"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94114"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94115"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94116"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94117"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94118"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94119"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411a"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411b"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411c"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411d"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411e"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d9411f"), "votes" : [ ], "answers" : [ ], "views" : [ ] }
{ "_id" : ObjectId("5bbde11cb395bb1dc0d94120"), "votes" : [ ], "answers" : [ ], "views" : [ ] }

так как вы можете видеть, что все элементы пустые, единственный способ получить некоторый результат - с помощью xpath:

//div[contains(@class, "views")]/text()

По моему пониманию с помощью "//" означают все элементы в div, где class= "views"

использование этого метода работает только частично, так как я получаю только вывод для элемента views, и все выходные данные хранятся в одной строке элемента, а затем для следующего цикла во всем выходном файле сохраняется в следующей строке элемента, что имеет смысл, потому что я с помощью

//div instead of div

Это происходит "или я думаю, что это" из-за цикла, где он проходит через число "итоговых" классов на странице в качестве метода для сообщения скребку, сколько строк очищается и сохраняется, это делается со следующим xpath и сегмент кода "Я отобразил его выше, но просто для ясности":

    def parse(self, response):
        popularity =     Selector(response).xpath('//div[@class="summary"]/h3')


    for poppart in popularity:

вывод, который я даю при использовании

//div

как следует:

{ "_id" : ObjectId("5bbdf34ab395bb249c3c71c2"), "votes" : [ "\r\n                        ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                " ], "answers" : [ ], "views" : [ "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    3 views\r\n", "\r\n    8 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    5 views\r\n", "\r\n    10 views\r\n", "\r\n    5 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    14 views\r\n", "\r\n    2 views\r\n", "\r\n    5 views\r\n", "\r\n    3 views\r\n", "\r\n    5 views\r\n", "\r\n    3 views\r\n", "\r\n    6 views\r\n", "\r\n    7 views\r\n", "\r\n    3 views\r\n", "\r\n    7 views\r\n", "\r\n    5 views\r\n", "\r\n    14 views\r\n", "\r\n    4 views\r\n", "\r\n    12 views\r\n", "\r\n    16 views\r\n", "\r\n    7 views\r\n", "\r\n    7 views\r\n", "\r\n    7 views\r\n", "\r\n    4 views\r\n", "\r\n    4 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    3 views\r\n", "\r\n    3 views\r\n", "\r\n    8 views\r\n", "\r\n    2 views\r\n", "\r\n    10 views\r\n", "\r\n    6 views\r\n", "\r\n    3 views\r\n" ] }
{ "_id" : ObjectId("5bbdf34ab395bb249c3c71c3"), "votes" : [ "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                ", "\r\n                    ", "\r\n                    ", "\r\n                " ], "answers" : [ ], "views" : [ "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    3 views\r\n", "\r\n    8 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    5 views\r\n", "\r\n    10 views\r\n", "\r\n    5 views\r\n", "\r\n    2 views\r\n", "\r\n    2 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    14 views\r\n", "\r\n    2 views\r\n", "\r\n    5 views\r\n", "\r\n    3 views\r\n", "\r\n    5 views\r\n", "\r\n    3 views\r\n", "\r\n    6 views\r\n", "\r\n    7 views\r\n", "\r\n    3 views\r\n", "\r\n    7 views\r\n", "\r\n    5 views\r\n", "\r\n    14 views\r\n", "\r\n    4 views\r\n", "\r\n    12 views\r\n", "\r\n    16 views\r\n", "\r\n    7 views\r\n", "\r\n    7 views\r\n", "\r\n    7 views\r\n", "\r\n    4 views\r\n", "\r\n    4 views\r\n", "\r\n    3 views\r\n", "\r\n    2 views\r\n", "\r\n    4 views\r\n", "\r\n    3 views\r\n", "\r\n    3 views\r\n", "\r\n    8 views\r\n", "\r\n    2 views\r\n", "\r\n    10 views\r\n", "\r\n    6 views\r\n", "\r\n    3 views\r\n" ] }

Введите "it" для более

Я показываю только две строки, но это делается для количества строк, заданных forloop.

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

Я включаю в себя мою трубку, настройки и элементы для завершения.

Настройки:

BOT_NAME = 'stack'

SPIDER_MODULES = ['stack.spiders']
NEWSPIDER_MODULE = 'stack.spiders'


# Crawl responsibly by identifying yourself (and your website) on the     user-agent
#USER_AGENT = 'stack (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

ITEM_PIPELINES = {'stack.pipelines.MongoDBPipeline': 300}

MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "testpop13" 

Предметы:

import scrapy


from scrapy.item import Item, Field



class QuestionItem(Item):
    title = Field()
    url = Field()

class PopularityItem(Item):
    votes = Field()
    answers = Field()
    views = Field()


class ModifiedItem(Item):
    lastModified = Field()
    modName = Field()

Шифра:

import pymongo
import logging

class StackPipeline(object):
    def process_item(self, item, spider):
        return item



from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import log

class MongoDBPipeline(object):


    def __init__(self):

    connection = pymongo.MongoClient(settings['MONGODB_SERVER'],     settings['MONGODB_PORT'])
        self.db = connection[settings['MONGODB_DB']]

    def process_item(self, item, spider):
        collection = self.db[type(item).__name__.lower()]
        logging.info(collection.insert(dict(item)))
        return item

и, наконец, как выглядит правильный вывод из паттерна вопросов:

> db.questionitem.find()
{ "_id" : ObjectId("5bbdfa29b395bb1c74c9721c"), "title" : "Why I can't enforce EditTextPreference to take just numbers?", "url" : "/questions/52741046/why-i-cant-enforce-edittextpreference-to-take-just-numbers" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9721d"), "title" : "mysql curdate method query is not giving correct result", "url" : "/questions/52741045/mysql-curdate-method-query-is-not-giving-correct-result" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9721e"), "title" : "how to execute FME workbench with parameters in java", "url" : "/questions/52741044/how-to-execute-fme-workbench-with-parameters-in-java" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9721f"), "title" : "create a top 10 list for multiple groups with a ranking in python", "url" : "/questions/52741043/create-a-top-10-list-for-multiple-groups-with-a-ranking-in-python" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97220"), "title" : "Blob binding not working in VS2017 Azure function template", "url" : "/questions/52741041/blob-binding-not-working-in-vs2017-azure-function-template" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97221"), "title" : "How to convert float to vector<unsigned char> in C++?", "url" : "/questions/52741039/how-to-convert-float-to-vectorunsigned-char-in-c" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97222"), "title" : "Nginx serving server and static build", "url" : "/questions/52741038/nginx-serving-server-and-static-build" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97223"), "title" : "Excel Shortout key to format axis bound?", "url" : "/questions/52741031/excel-shortout-key-to-format-axis-bound" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97224"), "title" : "POST successful but the data doesn't appear in the controller", "url" : "/questions/52741029/post-successful-but-the-data-doesnt-appear-in-the-controller" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97225"), "title" : "Node - Nested For loop async behaviour", "url" : "/questions/52741028/node-nested-for-loop-async-behaviour" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97226"), "title" : "KSH Shell script not zipping up files", "url" : "/questions/52741027/ksh-shell-script-not-zipping-up-files" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97227"), "title" : "Property 'replaceReducer' does not exist on type 'Store<State>' After upgrading @ngrx/store", "url" : "/questions/52741023/property-replacereducer-does-not-exist-on-type-storestate-after-upgrading" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97228"), "title" : "passing more than 10 arguments to a shell script within gitlab yaml", "url" : "/questions/52741022/passing-more-than-10-arguments-to-a-shell-script-within-gitlab-yaml" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c97229"), "title" : "Setting an environmental variable in a docker-compose.yml file is the same as setting that variable in a .env file?", "url" : "/questions/52741021/setting-an-environmental-variable-in-a-docker-compose-yml-file-is-the-same-as-se" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722a"), "title" : "Pass list of topics from application yml to KafkaListener", "url" : "/questions/52741016/pass-list-of-topics-from-application-yml-to-kafkalistener" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722b"), "title" : "Copy numbers at the beggining of each line to the end of line", "url" : "/questions/52741015/copy-numbers-at-the-beggining-of-each-line-to-the-end-of-line" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722c"), "title" : "Pretty JSON retrieved from response in GoLang", "url" : "/questions/52741013/pretty-json-retrieved-from-response-in-golang" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722d"), "title" : "Swift: Sorting Core Data child entities based on Date in each parent", "url" : "/questions/52741010/swift-sorting-core-data-child-entities-based-on-date-in-each-parent" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722e"), "title" : "How to create Paypal developer account", "url" : "/questions/52741009/how-to-create-paypal-developer-account" }
{ "_id" : ObjectId("5bbdfa2ab395bb1c74c9722f"), "title" : "output of the program and explain why a and b showing different values", "url" : "/questions/52741008/output-of-the-program-and-explain-why-a-and-b-showing-different-values" }
Type "it" for more

Из этого выхода я могу сохранить его в CSV, и все работает.

Я прошу прощения за длинный пост, я хотел быть как можно более полным, если какая-либо другая информация требуется, пожалуйста, не стесняйтесь спрашивать, я буду внимательно следить за этим вопросом.

Заранее благодарю за любую помощь.

  • 0
    Вы действительно думаете, что вся предоставленная информация необходима для воспроизведения проблемы XPath?
  • 0
    Я просто хотел создать четкое представление о проблеме и результатах, если она будет за бортом, я буду принимать это во внимание, а не переусердствовать с будущими вопросами.
Показать ещё 1 комментарий
Теги:
xpath
web-scraping
scrapy

1 ответ

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

Во-первых, вам не нужно писать

Selector(response).xpath(...)

Вместо этого вы можете просто написать

response.xpath(...)

Во-вторых, в PopularitySpider вам нужно изменить селектор как: -

popularity = response.xpath('//div[contains(@class, "question-summary")]')

for poppart in popularity:
       item = PopularityItem()
       item['votes'] = poppart.xpath(
            '//div[contains(@class, "votes")]//span/text()').extract()
       item['answers'] = poppart.xpath(
            '//div[contains(@class, "answered")]//span/text()').extract()
       item['views'] = poppart.xpath(
            '//div[contains(@class, "views")]//span/text()').extract()
       yield item

Надеюсь, он решает вашу проблему.

Примечание. Хорошей практикой для проверки того, работает ли ваш селектор, является использование опции проверки в браузере (хром и т.д.), Даже лучший вариант - проверить ваш код в оболочке scrapy. Вам просто нужно запустить следующую команду: -

scrapy shell www.example.com
  • 0
    Спасибо за предложение оболочки, я попытался использовать оболочку, и она отлично работает при использовании оболочки, однако при реализации кода все выходные данные пусты, как в приведенном выше примере, это должно означать, что есть проблема с чем-то другим чем xpaths, как он работает в оболочке, я также попытался использовать его без цикла и просто сохранить в одну строку и элемент, но результаты остались прежними.
  • 0
    Я обнаружил проблему, мой стартовый URL был задан неверно, он в основном работает как задумано, единственная проблема заключается в том, что вся извлеченная информация хранится в одном идентификаторе за раз, например, голосов: 2, 4, 5, просмотров: 3 , 6, 7 и ответы: 2, 7, 3 Вместо голосов: 2, просмотров: 4, ответов: 5 на каждый идентификатор, это, скорее всего, связано с использованием "// div", какие-либо предложения для альтернативного метода? Я пытался использовать просто "div", но это не сработало.
Показать ещё 2 комментария

Ещё вопросы

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