Выскабливание для связанных новостей, используя Scrapy - PullRequest
0 голосов
/ 05 апреля 2019

Я хочу удалить сайт проверки фактов Snopes с помощью Scrapy.Здесь я хочу узнать связанные новости, основанные на вводе данных пользователем.Пользователь дает слово, и сканер 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 Ответ

1 голос
/ 05 апреля 2019

В вашем коде есть одна существенная ошибка:

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?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...