Python-Scrapy не может извлечь данные


Я только начинаю с Python / Scrapy.

У меня есть написанный паук, который ползает по веб-сайту и собирает информацию. Но я застрял в двух местах.

  1. Я пытаюсь извлечь телефонные номера со страницы, и они закодированы следующим образом

    <span class="mrgn_right5">(+001) 44 42676000,</span>
    <span class="mrgn_right5">(+011) 44 42144100</span>
    

У меня есть код:

getdata = soup.find(attrs={"class":"mrgn_right5"})
if getdata:
   aditem['Phone']=getdata.get_text().strip()
   #print phone
Но он извлекает только первый набор чисел, а не второй. Как я могу это исправить?
  1. на той же странице есть еще один набор информация

Я использую этот код

    getdata = soup.find(attrs={"itemprop":"pricerange"})
    if getdata:
        #print getdata
        aditem['Pricerange']=getdata.get_text().strip()
        #print pricerange
Но это не приносит никакой вещи. Любая помощь в исправлении этих двух была бы большой.
1 2

1 ответ:

Из обзора документации по красивому супу, find вернет только один результат. Если ожидается/требуется несколько результатов, то вместо них используйте find_all. Так как есть два результата, список будет возвращен, поэтому элементы списка должны быть объединены вместе (например), чтобы добавить их в поле Phone вашего AdItem.

getdata = soup.find_all(attrs={"class":"mrgn_right5"})
if getdata:
   aditem['Phone'] = ''.join([x.get_text().strip() for x in getdata])

Для второго вопроса вам необходимо получить доступ к атрибутам возвращаемого объекта. Попробуйте следующее:

getdata = soup.find(attrs={"itemprop":"pricerange"})
if getdata:
    aditem['Pricerange'] = getdata.attrs['content']

И для адреса информация, следующий код работает, но очень избитый и, без сомнения, может быть улучшен кем-то, кто понимает красивый суп лучше, чем я.

getdata = soup.find(attrs={"itemprop":"address"})
address = getdata.span.get_text()
addressLocality = getdata.meta.attrs['content']
addressRegion = getdata.find(attrs={"itemprop":"addressRegion"}).attrs['content']
postalCode = getdata.find(attrs={"itemprop":"postalCode"}).attrs['content']