我想使用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)
答案 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?"