Scrapy - Борьба с получением текста - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь построить скребок с помощью Scrapy и пытаюсь вернуть желаемый текст.Любая помощь будет принята с благодарностью.

Вот мой код:

import scrapy
from scrapy.spiders import Request
from scrapy.linkextractors import LinkExtractor
from scrapy.http import HtmlResponse  
import re
from urllib import *


BASE_URL = 'http://murderpedia.org/'
PROTOCOL = 'https:'

Вот мой класс предметов

class CornFlakeItem(scrapy.Item):

    name = scrapy.Field()
    bio = scrapy.Field()
    images = scrapy.Field()
    link = scrapy.Field()
    image_urls = scrapy.Field()
    bio_image = scrapy.Field()
    image_paths = scrapy.Field()  

    classification = scrapy.Field()
    characteristics = scrapy.Field()
    number_of_victims = scrapy.Field()
    date_of_murders = scrapy.Field()
    date_of_birth = scrapy.Field()
    victims_profile = scrapy.Field()
    method_of_murder = scrapy.Field()
    location = scrapy.Field()
    status = scrapy.Field()

Вот мой био класс:

class CornFlakeBio(scrapy.Spider):
    name = 'corn-flake-killers'
    start_urls = ['http://murderpedia.org/male.A/index.A.htm']

Вот моя функция разбора:

    def parse(self, response):

        table= 
        response.xpath('//td[contains(font//font/text(),
        "Victims")]/../..')
        urls = table.xpath('//a/@href').extract()
        for url in urls:
            if (url.startswith('mailto:')): 
                yield None
            else:
                yield Request(response.urljoin(url), self.parse_person)

Вот моя функция разбора:

    def parse_person(self, response):

        table = response.xpath('//*[@id="table4"]')
        for row in table.xpath('//tbody'):


            text = {
             'Classification' : 
             row.xpath('//tr[3]/td/style/text()').extract_first(),
             'Characteristics': 
             row.xpath('//tr[4]/td/style/text()').extract_first(),
             'Number of Victims' : 
             row.xpath('//tr[5]/td/style/text()').extract_first(),
            'Date of Murders': 
             row.xpath('//tr[6]/td/style/text()').extract_first(),
            'Date of Birth': 
             row.xpath('//tr[7]/td/style/text()').extract_first(), 
            'Victims Profile': 
             row.xpath('//tr[8]/td/style/text()').extract_first(), 
            'Method of Murder': 
             row.xpath('//tr[9]/td/style/text()').extract_first(),  
            'Location' : 
            row.xpath('//tr[10]/td/style/text()').extract_first(),
            'Status' : 
            row.xpath('//tr[11]/td/style/text()').extract_first()}

            text = ''.join(text) 

            print(text)[:10] 

У меня такое чувство, что моя проблема заключается в xpath для каждого человекагрести, а может и нет?...

Любая помощь здесь будет очень признательна.

Вот основные моменты из моего обновленного файла журнала:

1 Ответ

0 голосов
/ 25 октября 2018

Я подозреваю, что вы получаете эту ошибку, потому что один (или более) из ваших URL внутри <a href="some URL"> на самом деле является чем-то другим , чем ссылкой на веб-страницу.Таким образом, в данном случае выглядит, что это может быть ссылка для отправки электронного письма на определенный адрес электронной почты

. Вы можете использовать экстракторы ссылок из scrapy: https://doc.scrapy.org/en/latest/topics/link-extractors.html

ИЛИ

Вы можете выполнить некоторую фильтрацию строк в Python, чтобы следить за такими вещами, как якорные теги (начинаются с #) или адреса электронной почты (часто начинающиеся с mailto)

Этот ответ я дал недавноможет дать дополнительный контекст для необязательного чтения: https://stackoverflow.com/a/52900592/9693088

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...