Какой правильный XPath-файл Scrapy для элементов <p>, неправильно размещенных в тегах <h>? - PullRequest
0 голосов
/ 25 марта 2019

Я настраиваю свой первый Scrapy Spider, и у меня возникают трудности с использованием xpath для извлечения определенных элементов.

Моя цель http://www.cbooo.cn/m/641515 (китайский сайт похож на Box Office Mojo).Я могу без проблем извлечь китайское название фильма 阿龙 浴血 记, но не могу понять, как получить информацию под ним.Я считаю, что это потому, что HTML не является стандартным, как обсуждалось здесь .Под заголовком есть несколько элементов параграфа.

Я пробовал решение по ссылке выше, а также здесь , но безрезультатно.

def parse(self, response):
    chinesetitle = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/h2/text()').extract()
    englishtitle = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/h2/p').extract()
    chinesereleasedate = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[4]').extract()
    productionregions = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[6]').extract()
    chineseboxoffice = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[1]/span/text()[2]').extract()
    yield {
        'chinesetitle': chinesetitle,
        'englishtitle': englishtitle,
        'chinesereleasedate': chinesereleasedate,
        'productionregions': productionregions,
        'chineseboxoffice': chineseboxoffice
        }

Когда я запускаю паука в оболочке Scrapy, паук находит название на китайском, как и ожидалось.Тем не менее, оставшиеся элементы возвращают либо [], либо странное смешивание текста на странице.

Любой совет?Это мой первый замечательный проект по программированию, поэтому я ценю ваше терпение с моим невежеством и вашу помощь.Спасибо!

РЕДАКТИРОВАТЬ

Попробовал реализовать метод очистки текста в комментариях.Пример в комментариях сработал, но когда я попытался переопределить его, я получил «Ошибка атрибута: у объекта« список »нет атрибута« разделение »» (см. Ниже примеры кассовых сборов в Китае, страну происхождения и примеры жанров)

def parse(self, response):
        chinesetitle = response.css('.cont h2::text').extract_first()
        englishtitle = response.css('.cont h2 + p::text').extract_first()
        chinaboxoffice = response.xpath('//span[@class="m-span"]/text()[2]').extract_first()        
        chinaboxoffice = chinaboxoffice.split('万')[0]
        chinareleasedate = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first()
        chinareleasedate = chinareleasedate.split(':')[1].split('(')[0]
        countryoforigin = response.xpath('//div[@class="ziliaofr"]/div/p')[6].xpath('text()').extract_first()
        countryoforigin = countryoforigin.split(':')[1]
        genre = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"类型")]/text()').extract_first()
        genre = genre.split(':')[1]
        director = response.xpath('//*[@id="tabcont1"]/dl/dd[1]/p/a/text()').extract()

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Кстати, вам не нужно мучить себя с помощью xpath, вы можете использовать css:

response.css('.cont h2::text').extract_first()
# '战狼2'
response.css('.cont h2 + p::text').extract_first()
# 'Wolf Warriors 2'
2 голосов
/ 25 марта 2019

Вот несколько примеров, из которых вы можете сделать вывод о последнем. Не забывайте всегда использовать атрибут class или id для идентификации html-элемента. /div[3]/div[2]/div/div[1]/.. не очень хорошая практика.

chinesetitle = response.xpath('//div[@class="ziliaofr"]/div/h2/text()').extract_first()
englishtitle = response.xpath('//div[@class="ziliaofr"]/div/p/text()').extract_first()
chinesereleasedate = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first())
productionregions = response.xpath('//div[@class="ziliaofr"]/div/p')[6].xpath('text()').extract_first()

Чтобы найти chinesereleasedate, я взял элемент p, текст которого содержит '上映时间'. Вы должны разобрать это, чтобы получить точное значение.

Чтобы найти productionregions Я взял 7-й селектор из списка response.xpath('//div[@class="ziliaofr"]/div/p')[6] выделил текст. Лучшим способом было бы проверить, содержит ли текст '国家 及 地区', как указано выше.

Редактировать: Чтобы ответить на вопрос в комментариях,

response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first()

возвращает строку типа '\r\n 上映时间:2017-7-27(中国)\r\n ', которая не является тем, что вы ищете. Вы можете очистить его как:

chinesereleasedate = chinesereleasedate.split(':')[1].split('(')[0]

Это дает нам правильную дату.

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