使用Scrapy刮取相关新闻

问题描述 投票:0回答:1

我想使用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)
python web-scraping scrapy
1个回答
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?"
© www.soinside.com 2019 - 2024. All rights reserved.