使用Scrapy搜寻相关新闻

时间:2019-04-05 01:43:34

标签: python web-scraping scrapy

我想使用Scrapy删除Snopes事实检查网站。在这里,我想根据用户给定的输入找出相关新闻。用户输入一个单词,Scrapy爬虫将返回相关新闻。例如,如果我输入NASA作为输入,Scrapy将提供与NASA相关的新闻。我尝试过,但是没有输出。

import scrapy

class fakenews(scrapy.Spider):
    name = "snopes5"
    allowed_domains = ["snopes.com"]
    start_urls = [
            "https://www.snopes.com/fact-check/category/science/"
    ]

    def parse(self, response):
            name1=input('Please Enter the search item you want for fake news: ')
            headers = response.xpath('//div[@class="media-body"]/h5').extract()
            headers = [c.strip().lower() for c in headers]
            if name1 in headers:
                print(response.xpath('//div[@class="navHeader"]/ul'))
                filename = response.url.split("/")[-2] + '.html'
                with open(filename, 'wb') as f:
                    f.write(response.body)

1 个答案:

答案 0 :(得分:1)

您的代码中有一个重大错误:

c=response.xpath('//div[@class="navHeader"]/ul')
if name1 in c:
    ...

这里c最终是一个SelectorList对象,并且您正在检查字符串name是否在SelectorList对象中,该对象当然永远是False
为了解决这个问题,您需要提取值:

c=response.xpath('//div[@class="navHeader"]/ul').extract()
                                                ^^^^^^^^^^

另外,您可能希望处理这些值以使匹配更加不稳定:

headers = response.xpath('//div[@class="navHeader"]/ul').extract()
headers = [c.strip().lower() for c in headers]
if name1 in headers:
    ...

上面的代码将忽略尾部和前导空格,并使所有内容都变为小写,以区分大小写。


您的用例示例:

headers = sel.xpath('//div[@class="media-body"]/h5/text()').extract() 
headers = [c.strip().lower() for c in headers]  
for header in headers: 
    if 'gorilla' in header: 
        print(f'yay matching header: "{header}"')                       

输出:

yay matching header: "did this gorilla learn how to knit?"