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

时间:2018-09-23 12:42:58

标签: python html scrapy

我需要确定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"]

将以上内容输出到.csv文件仍然返回空白文件,尽管output ct返回带有两行的{.1v}和content-type的.csv文件。如何仅提取答案的“ html”文本部分?

3 个答案:

答案 0 :(得分:0)

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

from lxml import etree

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

答案 1 :(得分:0)

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

如果您对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

编辑:

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

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

花一些时间阅读documentation page about selectors。值得投资。

答案 2 :(得分:0)

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

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

您可以:通过以下方式进行pip安装:

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