2012-11-15 4 views
3

나는 내가 Xapi를 사용하여 검색 패스트 푸드 레스토랑의 일부 OSM 데이터를 가지고, 그리고 here은 일부 샘플 결과입니다 : 내가 추출하는 파이썬에서 사용 BeautifulSoup로에 노력하고있어BeautifulSoup로 찾는 XML 태그

<osm version="0.6" generator="Osmosis SNAPSHOT-r26564"> 
    <node id="486275964" version="4" timestamp="2010-05-03T08:21:42Z" uid="12055" user="aude" changeset="4592597" lat="38.8959533" lon="-77.0212458"> 
     <tag k="name" v="Potato Valley Cafe"/> 
     <tag k="amenity" v="fast_food"/> 
    </node> 
    <node id="486275966" version="4" timestamp="2010-08-06T16:44:13Z" uid="207745" user="NE2" changeset="5418228" lat="38.8959399" lon="-77.0196338"> 
     <tag k="cuisine" v="burger"/> 
     <tag k="name" v="McDonald's"/> 
     <tag k="amenity" v="fast_food"/> 
    </node> 
    <node id="612190923" version="1" timestamp="2010-01-12T14:01:27Z" uid="111209" user="cov" changeset="3603297" lat="38.893683" lon="-77.0292732"> 
     <tag k="level" v="-1"/> 
     <tag k="cuisine" v="sandwich"/> 
     <tag k="name" v="Quizno's"/> 
     <tag k="amenity" v="fast_food"/> 
    </node> 
</osm> 
<!--corrected indentation--> 

위도, 긴, 이름 및 요리. 이 코드와 위도 긴 문제를 얻을 수 있습니다

soup = BeautifulSoup(results) 
takeaways = soup.findAll('node') 

for eachtakeaway in takeaways: 
    longitude = str(eachtakeaway['lon']) 
    lattitude = str(eachtakeaway['lat']) 

그러나 나는 이름을 얻을 수 없습니다

name = str(eachtakeaway['name']) 

오류 던졌습니다 :

TypeError: 'NoneType' object is not callable 

수를 너 내가해야할 일을 말해? 감사.

답변

4

문제는, 대괄호, 즉 latlon 태그의 속성을 검색 할 수 있습니다. 그러나 이름은 다른 태그의 속성입니다. 다음과 같이 시도하십시오.

soup = BeautifulSoup(results) 
takeaways = soup.findAll('node') 

for eachtakeaway in takeaways: 
    another_tag = eachtakeaway('tag') 
    for tag_attrs in another_tag: 
     if str(tag_attrs['k']) == 'cuisine': 
      print str(tag_attrs['v']) 

이렇게하면 요리의 가치가 반환됩니다. 같은 개념이 name 검색에 적용됩니다.

* 테스트되지 않음

+0

bs4에는 xml 모드가 있습니다. 왜 내가 XML 모드를 이런 식으로 사용할 것인가? – kalu

+1

@kalu 내 bs4 환경이 제한되어 있지만 bs4의 xml 모드가 xml 네임 스페이스, 대소 문자 구분 태그 처리 및 기타 XML 특성을 지원한다는 인상하에 있습니다. 나는 친구들/동료들과의 대화에서 그려 내고 있으며 그 문제를 연구하지 않았기 때문에 이것을 보장 할 수는 없습니다. – That1Guy

2

<node> 요소에는 name 속성이 없습니다. 태그의 자식 태그를 수행합니다

for eachtakeaway in takeaways: 
    longitude = str(eachtakeaway['lon']) 
    lattitude = str(eachtakeaway['lat']) 
    nametag = eachtakeaway.find('tag', k='name') 
    name = str(nametag['v']) if nametag is not None else '' 

데모 :

>>> takeaways = soup.findAll('node') 
>>> for eachtakeaway in takeaways: 
...  nametag = eachtakeaway.find('tag', k='name') 
...  print str(nametag['v']) if nametag is not None else '' 
... 
Potato Valley Cafe 
McDonald's 
Quizno's