Xpath верный, но без результата после очистки - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь сканировать все названия городов в следующей сети: https://www.zomato.com/directory.

Я пытался использовать следующий xpath.

python
#1st approach:
def parse(self,response):
    cities_name = response.xpath('//div//h2//a/text()').extract_first()
    items['cities_name'] = cities_name
    yield items 
 #2nd approach:

def parse(self,response):
 for city in response.xpath("//div[@class='col-l-5 col-s-8 item pt0 pb5 
   ml0']"):
        l = ItemLoader(item = CountryItem(),selector = city)
        l.add_xpath("cities_name",".//h2//a/text()")
        yield l.load_item()
        yield city

Фактический результат: сканирование0 страниц и соскоб 0 предметов
Ожидается: Аделаида, Балларат и т. Д.

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Первое, что нужно отметить:
Ваш xpath слишком конкретен. Классы CSS в HTML не всегда имеют надежный порядок. class1 class2 может в конечном итоге стать class2 class1 или даже иметь какой-то сломанный синтаксис, такой как конечные пробелы: class1 class2.

Когда вы напрямую сопоставляете свой xpath с [@class="class1 class2"], есть большая вероятность, что он потерпит неудачу. Вместо этого вы должны попытаться использовать функцию contains.

Второе:
У вас есть маленькая ошибка в вашем cities_name xpath. В теле html это> h2> текст, а в вашем коде он обратный h2>a>text

Так что, как говорится, мне удалось заставить его работать с этими селекторами css и xpath:

$ parsel "https://www.zomato.com/directory"                                                                           
> p.mb10>a>h2::text +first                                                                                            
Adelaide
> p.mb10>a>h2::text +len                                                                                              
736
> -xpath                                                                                                              
switched to xpath
> //p[contains(@class,"mb10")]/a/h2/text() +first                                                                     
Adelaide
> //p[contains(@class,"mb10")]/a/h2/text() +len                                                                       
736

parselcli - https://github.com/Granitosaurus/parsel-cli

0 голосов
/ 27 июня 2019

Основная причина, по которой вы не получаете никаких результатов с этой страницы, заключается в том, что html-элементы этого сайта плохо сформированы.Вы можете получить результаты, используя html5lib парсер.Я пробовал с разными парсерами, но тот, который я только что упомянул, сработал.Вот как вы можете это сделать.Я использовал селектор CSS, хотя.

import scrapy
from bs4 import BeautifulSoup

class ZomatoSpider(scrapy.Spider):
    name = "zomato"

    start_urls= ['https://www.zomato.com/directory']

    def parse(self, response):
        soup = BeautifulSoup(response.text, 'html5lib')
        for item in soup.select(".row h2 > a"):
            yield {"name":item.text}
0 голосов
/ 27 июня 2019

У вас неправильный XPath:

def parse(self,response):
 for city_node in response.xpath("//h2"):
        l = ItemLoader(item = CountryItem(), selector = city_node)
        l.add_xpath("city_name", ".//a/text()")
        yield l.load_item()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...