Python / Scrapy: как определить, является ли страница HTML или нет? - PullRequest
0 голосов
/ 23 сентября 2018

Мне нужно определить, является ли страница, загруженная пауком Scrapy, html или нет.На сайте, который я хочу, чтобы паук сканировал, есть сочетание ссылок pdf и html.Следовательно, если он натолкнется на PDF-файл, он отправит ответ через PDFReader, иначе он прочтет HTML-файл как есть.Это часть моего кода, но он не работает:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "spyder_OLD"
    allowed_domains = ['doc.scrapy.org']
    start_urls = ['https://doc.scrapy.org/en/latest/index.html']

    def parse(self, response):
        ct = response.headers.get("content-type", "").lower()
        return ct

Я выводю результаты паука в файл .csv, но он всегда пуст.Просто наличие ct = response.headers выводит всю информацию заголовка, что бесполезно.Что мне делать?

РЕДАКТИРОВАТЬ: Мне наконец удалось вернуть словарь, но я все еще не могу извлечь соответствующую информацию:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "spyder_OLD"
    allowed_domains = ['doc.scrapy.org']
    start_urls = ['https://doc.scrapy.org/en/latest/index.html']

    def parse(self, response):
        ct = {"content-type": response.headers.get("content-type", "").lower()}
        return ct["content-type"]

Вывод вышеприведенногов файл .csv по-прежнему возвращает пустой файл, хотя output ct возвращает файл .csv с двумя строками: content-type и text/html.Как извлечь текстовую часть ответа только в формате html?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Scrapy ожидает, что вы вернете элемент из вашего метода разбора.Это может быть dict или объект Item .

Если вы заинтересованы в Content-Type:

def parse(self, response):
    ct = response.headers.get("content-type", "").lower()
    return {'content-type': ct}

Scrapy имеет действительно хороший учебник.Стоит потратить некоторое время, чтобы следовать этому: https://doc.scrapy.org/en/latest/intro/tutorial.html

РЕДАКТИРОВАТЬ:

Вы можете найти HTML-код в свойстве response.text.Но, как правило, вы захотите просто кусок этого кода.Таким образом, лучший подход заключается в использовании селекторов .Например, чтобы получить только текст внутри фрагмента <h1>Hello world</h1>, вы можете использовать:

title = response.css('h1::text').get()
return {'title': title}

Потратьте некоторое время, чтобы прочитать страницу документации о селекторах .Это стоит инвестиций.

0 голосов
/ 23 сентября 2018

Не уверен, что он все еще рядом.Но похоже, что встроенный модуль может быть вам полезен?

Он показывает различные внедряемые фреймворки JavaScript, веб-фреймы и веб-серверы.Вы можете Google веб-фреймворки и определить, используются ли они для динамической загрузки контента.

Вы можете: установить pip с

https://pypi.org/project/builtwith/1.3.3/

0 голосов
/ 23 сентября 2018

Вы можете использовать модуль lxml и импортировать текст как html.Если он успешно разбирает, то это HTML.

from lxml import etree

Я разговариваю по телефону, поэтому не могу привести полный пример.etree.parse - это метод, который вы хотите.

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