2016-05-22 11 views
2

ich eine Liste von Elementen, die ich von einer Web-Seite extrahiert haben:get Attributwert 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 Element beginnt wie folgt aus:

<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> 
... 

Nun, wenn ich über alle iterieren Elemente aus Alist, ich möchte bestimmte Informationen extrahieren, die in einem Attribut gespeichert sind - geographische Koordinaten.

möchte ich smth so sagen: property_item['latitude'] und den Wert 33.82555

jedoch erhalten, so weit ich habe kein Glück gehabt. property_item.meta['content'] ergibt nur den ersten "Wert" (33.82555) und soup(itemprop="geo")[0].get_text() gibt leeres Ergebnis zurück.

Ich mag zu einem Zeitpunkt ein bestimmtes Element eines analysieren zu können, vorzugsweise ohne find_all() (falls es überhaupt möglich ist), weil latitude und longitude nur Sinn in Zusammenhang mit der spezifischen Eigenschaft, und ich muß auch beziehen sie sich auf eine Eigenschaft ID, etc.

Sorry im Voraus für eine neue Frage.

Antwort

1

Sie von Attributtext mit einem CSS-Selektor auswählen können, dh die itemprop Werte aus den Meta-Tags:

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] ein css selector verwendet das Meta-Tag zu finden, die eine itemprop hat mit der Text Wert Breitengrad und Sie ziehen den Inhalt aus und die gleiche Logik für die Länge.

Wenn Sie spezifischer sein wollte konnte man die li mit dem schweben ... Klasse finden und die Meta-Tags aus, dass ziehen.

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) 

Oder verwenden Sie die div mit dem itemprop Wert von geo.

geo = soup.select_one("div[itemprop=geo]") 
lat, lon = geo.select_one("meta[itemprop=latitude]")["content"], geo.select_one("meta[itemprop=longitude]")["content"] 
print(lat,lon)