获取属性值BeautifulSoup

时间:2016-05-22 17:15:37

标签: python-2.7 beautifulsoup html-parsing urllib

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

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()返回空结果。

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

提前抱歉提出新手问题。

1 个答案:

答案 0 :(得分: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查找带有文本值 latitude itemprop 的元标记,然后从中提取内容和经度的逻辑相同。

如果您想要更具体一点,可以使用 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)

或者将 div geo itemprop 值一起使用。

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)