我想使用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)
您的代码中存在一个重要错误:
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?"