scrapy дает мне неполную ссылку, которая мне нужна для разбора внутренних страниц - PullRequest
0 голосов
/ 06 ноября 2019

Итак, технически Scrapy дает мне правильную информацию, когда я говорю, чтобы она очищала:

link = row.xpath('.//p/a/@href').extract_first()

Проблема в том, что я получаю "/ biz / polkadog-bakery-boston? Osq = Dog«как показано в HTML-коде (см. изображение 1), но я хочу получить (2 на изображении)» https://www.yelp.com/biz/polkadog-bakery-boston?osq=Dog",, которое отображается только при наведении курсора на «ссылку».

image

Я хотел бы получить это, чтобы я мог проанализировать информацию на внутренних страницах.

Я пытался искать что-то подобное, но мне не повезло.

Если я не достаточно ясно, пожалуйста, дайте мне знать, прежде чем дать мне плохую оценку.

Спасибо

вот полный паук:

from scrapy import Spider
from yelp.items import YelpItem
import scrapy
import re 


class YelpSpider(Spider):
    name = "yelp"
    allowed_domains = ['www.yelp.com']
    # Defining the list of pages to scrape
    start_urls = ["https://www.yelp.com/search?find_desc=Dog&find_loc=Boston%2C%20MA&start=" + str(10 * i) for i in range(0, 1)] 



def parse(self, response):
    # Defining rows to be scraped
    rows = response.xpath('//*[@id="wrap"]/div[3]/div[2]/div[2]/div/div[1]/div[1]/div/ul/li')
    for row in rows:

        # Scraping Busines' Name
        name = row.xpath('.//p/a/text()').extract_first()

        # Scraping Phone number
        phone = row.xpath('.//div[1]/p[1][@class= "lemon--p__373c0__3Qnnj text__373c0__2pB8f text-color--normal__373c0__K_MKN text-align--right__373c0__3ARv7"]/text()').extract_first()

        # scraping area
        area = row.xpath('.//p/span[@class = "lemon--span__373c0__3997G"]/text()').extract_first()

        # Scraping services they offer
        services = row.xpath('.//a[@class="lemon--a__373c0__IEZFH link__373c0__29943 link-color--inherit__373c0__15ymx link-size--default__373c0__1skgq"]/text()').extract_first()

        # Extracting internal link
        link = row.xpath('.//p/a/@href').extract_first()



        item = YelpItem()    
        item['name'] = name
        item['phone'] = phone
        item['area'] = area
        item['services'] = services
        item['link'] = link


        yield item

def parse_detail(self, response):
    item = response.meta['item']
    address = response.xpath('.//*[@id="wrap"]/div[2]/div/div[1]/div/div[4]/div[1]/div/div[2]/ul/li[1]/div/strong/address/text()[1]').extract_first()

    item['address'] = address

    yield item

1 Ответ

0 голосов
/ 07 ноября 2019

Вам нужно использовать response.urljoin():

link = row.xpath('.//p/a/@href').extract_first()
link = response.urljoin(link)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...