【问题标题】:get attribute value BeautifulSoup获取属性值 BeautifulSoup
【发布时间】:2016-09-19 12:33:33
【问题描述】:

我有一个从网页中提取的元素列表:

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()(如果可能的话),因为latitudelongitude 仅在特定属性的上下文中才有意义,并且我还需要将它们与属性 ID 等相关联。

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

【问题讨论】:

    标签: python-2.7 beautifulsoup html-parsing urllib


    【解决方案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 文本值 latitude 的元标记,然后从中提取内容,逻辑相同经度

    如果您想更具体一些,您可以找到带有 hover... 类的 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)
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2013-09-14
      • 2015-08-28
      • 1970-01-01
      • 2010-12-13
      • 2011-02-06
      相关资源
      最近更新 更多