2015년 11월 13일 금요일

Beautiful Soup의 퀵 가이드 (예제)

파이썬의 데이터 추출의 끝판왕 Beautiful Soup에 대한 퀵 가이드 (예제)를 만든다.

예제로, XSD 형태의 아마존 상품 스키마를 사용했다.
내부 보안 문서라 부분 샘플링 했다.
* xsd : Xml Schema Definition

먼저 xsd 파일을 읽는다.

from bs4 import BeautifulSoup
bs = BeautifulSoup(open('sample.xsd'))

상품 데이터 명세의 속성 값을 불러 온다.

for i in bs.find('xsd:element',{'name':'Product'}).find_all('xsd:sequence')[0]:
    if i.name != 'xsd:element':
        continue
    try:
        if i.has_attr('ref'): print (i.get('ref'))
        if i.has_attr('name'): print (i.get('name'))
    except Exception as e:
        print (e)
        pass

* find_all의 매칭 block은 다음과 같은 성질을 가진다.
 - xml 예제 구조 : block1 { block2{} block{3} }
 - find_all 반환 리스트 구조 : [ block1{ block2{} block3{} }, block2{}, block3{} ]

상상의 날개를 펼쳐본다. 

 - 스트링 (string)
 - 정규식 (regular expression)
 - 리스트 (list)
 - 함수 (function)

import re

def foo(tag):
    return tag.name == 'xsd:sequence'

for i in bs.find(re.compile('x\w+:element'),{'name': lambda x: x == 'Product'}).find_all([foo,'xsd:sequence'])[1]:
    if i.name != 'xsd:element':
        continue
    try:
        if i.has_attr('ref'): print (i.get('ref'))
        if i.has_attr('name'): print (i.get('name'))
    except Exception as e:
        print (e)
        pass

* 다양한 필터 타입이 find 유사 메소드(Method)들의 태그(tag), 속성(attribution)에 적용 가능하다.


응용 코드를 공유한다.

아마존(amazon) MWS(Marketplace Web Service)의 Sellers API 사용시, 데이터 명세 xsd 파일의 레벨(Level) 단위 속성을 추출하는 코드다.
 - https://bitbucket.org/snippets/juhoon26/nRzqL
 - 코드 구조는 다음과 같다.





















 ---------       filename : sample.xsd    -----------

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xsd:element name="Product">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="SKU"/>
        <xsd:element ref="StandardProductID" minOccurs="0"/>
        <xsd:element name="GtinExemptionReason" minOccurs="0">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="bundle"/>
              <xsd:enumeration value="part"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>        
        <xsd:element ref="RelatedProductID" minOccurs="0"/>       
        <xsd:element ref="ProductTaxCode" minOccurs="0"/>
        <xsd:element name="LaunchDate" type="xsd:dateTime" minOccurs="0"/>
        <xsd:element name="OffAmazonChannel" minOccurs="0">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="advertise"/>
              <xsd:enumeration value="exclude"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="Dimensions">
    <xsd:sequence>
      <xsd:element name="Length" type="LengthDimension" minOccurs="0"/>
      <xsd:element name="Width" type="LengthDimension" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

0 개의 댓글:

댓글 쓰기