我有一个从网页中提取的元素列表:
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()
(如果可能的话),因为latitude
和longitude
只有意义特定属性的上下文,我还需要将它们与属性id等相关联。
提前抱歉提出新手问题。
答案 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)