Python Scrapy: пропустить Xpath, если его там нет

#python #xpath #scrapy

#python #xpath #scrapy

Вопрос:

У меня есть этот код, который очищает несколько сотен страниц для меня. Но иногда xpath для a вообще не существует, как я могу отредактировать это, чтобы скрипт не останавливался и продолжал работать, чтобы получить b и просто дать мне это для этой конкретной страницы?

 `a = response.xpath("//div[@class='headerDiv']/a/@title").extract()[0]
b = response.xpath("//div[@class='headerDiv']/text()").extract()[0].strip()
items['title'] = a   " "   b
yield items`
  

Ответ №1:

Просто проверьте результат extract() .

 nodes = response.xpath("//div[@class='headerDiv']/a/@title").extract()
a = nodes[0] if nodes else ""

nodes = response.xpath("//div[@class='headerDiv']/text()").extract()
b = nodes[0].strip() if nodes else ""

items['title'] = a   " "   b
yield items
  

С хорошим советом Падрайка Каннингема:

 a = response.xpath("//div[@class='headerDiv']/a/@title").extract_first(default='')
b = response.xpath("//div[@class='headerDiv']/text()").extract_first(default ='').strip() 
items['title'] = (a   " "   b).strip()
yield items
  

Комментарии:

1. extract_first(default ='') но вы собираетесь добавить начальный пробел, если a не существует, поэтому вам нужно только объединить a с b, если a существует, или просто добавить b

2. (a ' ' b).strip() будет перехватываться, когда a не возвращает совпадение. Вы также не хотите индексировать extract_first, поскольку он возвращает строку, поскольку вы получите только первый символ

Ответ №2:

Вы можете использовать следующим образом:

 import lxml.etree as etree

parser = etree.XMLParser(strip_cdata=False, remove_comments=True)
root = etree.fromstring(data, parser)

#Take Hyperlink as per xpath:
#But Xpath returns list of element so we have to take 0 index of it if it has element

a = root.xpath("//div[@class='headerDiv']/a/@title")
b = response.xpath("//div[@class='headerDiv']/text()")

if a:
    items['title'] = a[0].strip()   " "   b[0].strip() 
else:
    items['title'] = b[0].strip() 

yield items