获取属性值 BeautifulSoup

get attribute value 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>
...

现在,当我遍历列表中的所有元素时,我想提取存储在属性中的特定信息 - 地理坐标。

我想这样说: property_item['latitude'] 并得到值 33.82555

然而,到目前为止我没有运气。 property_item.meta['content'] 仅产生第一个 "value" (33.82555),而 soup(itemprop="geo")[0].get_text() return 为空结果。

我希望能够一次解析一个特定元素,最好不要使用 find_all()(如果可能的话),因为 latitudelongitude 只会使在特定 属性 的上下文中有意义,我还需要将它们与 属性 id 等联系起来

对于一个新手问题,提前致歉。

您可以 select 通过属性文本使用 css select 或者,即使用元标记中的 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 查找具有文本值 latitudeitemprop 的元标记] 然后你从中提取内容和 longitude.

的相同逻辑

如果您想更具体一些,您可以通过 hover... class 找到 li 并拉来自那个的元标记。

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)

或者使用 divgeoitemprop 值。

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)