2016-05-22 11 views
2

У меня есть список элементов, которые я извлеченный из веб-страницы:получить значение атрибута BeautifulSoup

property_list_items = soup.find_all("li", class_="hover propertyCard property-data-elem clickable") 
    if len(property_list_items) > 0: 
     for property_item in property_list_items: 
      print property_item.meta['content'] 
      print soup(itemprop="geo")[0].get_text() 

property_item элемент начинается так:

<li class="hover propertyCard property-data-elem clickable" data-city="Atlanta" data-feed-id="12310" data-list-index="0" data-location-id="52412" data-property-id="9000022319" data-property-state-code="GA" data-property-status="For Rent" id="propertyAnchor_0" itemscope="" itemtype="http://schema.org/ApartmentComplex"> 
<div itemprop="geo" itemscope="" itemtype="http://schema.org/GeoCoordinates"> 
    <meta content="33.82555" itemprop="latitude"/> 
    <meta content="-84.33807" itemprop="longitude"/> 
</div> 
... 

Теперь, когда я перебирать все элементы из alist, я хочу извлечь определенную информацию, которая хранится в атрибуте - географические координаты.

Я хочу сказать, что-л так: property_item['latitude'] и получить значение 33.82555

Однако, до сих пор у меня не было никакой удачи. property_item.meta['content'] приводит только к первой «величине» (33.82555) и soup(itemprop="geo")[0].get_text() возвращает пустой результат.

Я хочу, чтобы иметь возможность разобрать конкретный элемент по одному, предпочтительно без использования find_all() (если это вообще возможно), потому что latitude и longitude иметь смысл только в контексте конкретной собственности, и я также потребуется связать их с идентификатором собственности и т. д.

Извините заранее за вопрос новичков.

ответ

1

Вы можете выбрать текстом атрибута с помощью селектора CSS, то есть с помощью itemprop значения из мета-тегов:

In [1]: from bs4 import BeautifulSoup 

In [2]: h = """<li class="hover propertyCard property-data-elem clickable" data-city="Atlanta" data-feed-id="12310" data-list-index="0" data-location-id="52412" data-property-id="9000022319" data-property-state-code="GA" data-property-status="For Rent" id="propertyAnchor_0" itemscope="" itemtype="http://schema.org/ApartmentComplex"> 
    ...: <div itemprop="geo" itemscope="" itemtype="http://schema.org/GeoCoordinates"> 
    ...: <meta content="33.82555" itemprop="latitude"/> 
    ...: <meta content="-84.33807" itemprop="longitude"/> 
    ...: </div> 
    ...: </li>""" 

In [3]: soup = BeautifulSoup(h,"lxml") 

In [4]: lat, lon = soup.select_one("meta[itemprop=latitude]")["content"], soup.select_one("meta[itemprop=longitude]")["content"] 

In [5]: print(lat,lon) 

('33.82555', '-84.33807') 

meta[itemprop=latitude] использует css selector, чтобы найти мета-тег, который имеет itemprop с текстовое значение широта, и вы извлекаете содержимое из этой и той же логики для longitude.

Если вы хотите быть более точным вы могли бы найти Ли с парения ... класса и тянуть мета-теги из этого.

li = soup.select_one("li.hover.propertyCard.property-data-elem.clickable") 
lat, lon = li.select_one("meta[itemprop=latitude]")["content"], li.select_one("meta[itemprop=longitude]")["content"] 
print(lat,lon) 

Или использовать DIV со значением геоitemprop.

Смежные вопросы