Как: получить Python Scrapy для запуска простого поиска xpath - PullRequest
1 голос
/ 16 апреля 2019

Я очень плохо знаком с python и пытаюсь создать скрипт, который в конечном итоге будет извлекать заголовки страниц и s из указанных URL-адресов в .csv в указанном мною формате.

Я попытался заставить паука работать в CMD, используя:

response.xpath("/html/head/title/text()").get()

Так что xpath должен быть правильным.

К сожалению, когда я запускаю файл, в котором находится мой паук, он никогда не работает должным образом. Я думаю, что проблема заключается в последнем блоке кода, к сожалению, все руководства, которые я следую, похоже, используют CSS. Я чувствую себя более комфортно с xpath, потому что вы можете просто скопировать, вставить его из Dev Tools.

import scrapy
class PageSpider(scrapy.Spider):
    name = "dorothy"
    start_urls = [
        "http://www.example.com",
        "http://www.example.com/blog"]

def parse(self, response):
    for title in response.xpath("/html/head/title/text()"):
        yield {
        "title": sel.xpath("Title a::text").extract_first()
        }

Я ожидал, когда это даст мне заголовок страницы вышеупомянутых URL.

1 Ответ

1 голос
/ 16 апреля 2019

Прежде всего, ваш второй URL на self.start_urls недействителен и возвращает 404, так что в итоге вы извлечете только один заголовок.

Во-вторых, вам нужно больше узнать о селекторах , вы извлекли заголовок в своем тесте на оболочке, но запутались, когда использовали его на своем пауке.

Scrapy будет вызывать метод parse для каждого URL-адреса на self.start_urls, поэтому вам не нужно повторять заголовки, но у вас есть только один на страницу.

Вы также можете получить доступ к тегу <title> напрямую, используя // в начале выражения xpath, см. Этот текст, скопированный из W3Schools :

/   Selects from the root node
//  Selects nodes in the document from the current node that match the selection no matter where they are

Вот фиксированный код:

import scrapy

class PageSpider(scrapy.Spider):
    name = "dorothy"
    start_urls = [
        "http://www.example.com"
    ]

    def parse(self, response):
        yield {
            "title": response.xpath('//title/text()').extract_first()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...