#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 существует, или просто добавить b2.
(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