当前位置: 代码迷 >> python >> Python / Scrapy:如何确定页面是否为html?
  详细解决方案

Python / Scrapy:如何确定页面是否为html?

热度:47   发布时间:2023-06-27 21:51:02.0

我需要确定Scrapy Spider下载的页面是否为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

我将Spider的结果输出到.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"]

尽管output ct返回带有两行的.csv文件: content-typetext/html ,但将上述内容输出到.csv文件仍返回空白文件。 如何仅提取答案的“ html”文本部分?

您可以使用lxml模块并将文本导入为html。 如果解析成功,则为HTML。

from lxml import etree

我正在打电话,所以我不能给你一个完整的例子。 etree.parse是您想要的方法。

Scrapy希望您从解析方法中返回一个项目。 它可以是dict或 。

如果您对Content-Type感兴趣:

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

Scrapy有一个非常不错的教程。 值得花一点时间来关注它: :

编辑:

您可以在response.text属性中找到HTML代码。 但是通常,您只需要这段代码。 因此,更好的方法是使用选择器 例如,要获取片段<h1>Hello world</h1>的文本,可以使用:

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

花一些时间阅读的 。 值得投资。

不知道它是否还在附近。 但这听起来好像buildwith模块可能对您有用吗?

它向您展示了正在实施的各种JavaScript框架,Web框架和Web服务器。 您可以使用Google Web框架并确定它们是否用于动态加载内容。

您可以:pip install buildwith

  相关解决方案