2012-06-20 43 views
1

我想從某個網頁(在線書店)獲取一些數據。如何在Python中解析此網頁(並轉換爲字典)

的網頁看起來是這樣的:http://www.rob389.com/dp/tr/11/9789754681383

我想解析<script>節包含以下字符串:

tOBJ.DATA[0].MMM00_ITEM_CODE="9789754681383" 

凡是ISBN號碼。

我首先需要找到並提取正確的<script>部分。

然後,我想通過tOBJ.DATA [0]對象的內容進行迭代並將其轉換成一本字典它會是什麼樣子:

my_dict["MMM00_ITEM_CODE"] = "9789754681383" 
my_dict["MMM00_TITLE"] = "Uykusuz Bir Gece" 

等等...

我想可以用python做很少的幾行,但我弄不明白。

有什麼建議嗎?

在此先感謝。

PS:歡迎任何其他解析建議。

+1

這個肯定會更容易與一個適當的API。 –

+0

我同意,但我看不到任何獲取XML數據的方式。 –

+0

使用BeautifulSoup。易於使用選擇器來處理您要提取的數據。 – nathancahill

回答

1

我幾乎總是建議使用BeautifulSoup的 - 但是,這個頁面似乎有一個「< - >!」標籤中途下殺死解析器。因此,re救援...

import urllib 
import re 

url = 'http://www.rob389.com/dp/tr/11/9789754681383' 
txt = urllib.urlopen(url).read() 
pat = re.compile(r'tOBJ\.DATA\[0\]\.(\w+)\s*=\s*([^;]*);', flags=re.M|re.DOTALL) 
my_dict = dict((k,v.strip('"')) for k,v in pat.findall(txt)) 

這會導致132進入詞典,包括

'MMM00_ITEM_CODE': '9789751028440', 
'MMM00_ORG_TITLE': '026512', 
'MMM00_SRC_CODE': '9789754681383', 
'MMM00_TITLE': 'Uykusuz Bir Gece', 
'MMM00_TYPE': 'M', 
'MMM00_WEIGHT': '0', 
'MMM00_WIDTH': '13.6', 

如果你想將它限制爲僅與「MMM00」開始鍵,嘗試

my_dict = dict((k,v.strip('"')) for k,v in pat.findall(txt) if k.startswith('MMM00')) 

其中只返回15個項目。

+0

非常感謝。正是我在找什麼!有兩個答案,我選擇了較早的答案作爲答案。但這就是我的意思,「我想用python可以用少量行數來完成它」。 –

+1

我也不得不從「

+0

我建議在正則表達式中加入額外的''''去掉'''',並且只匹配以'MMM00'開頭的鍵' – Kimvais

1

您可以BeautifulSoup和代碼一點點做到這一點:

from bs4 import BeautifulSoup 
import urllib2 
from urlparse import urlsplit 

def isbnExtractor(url): 

    urlContent = url.strip('/').split('/') 
    print urlContent[6] 

,這應該做的伎倆。就像這樣:

PS python 
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from parse import isbnExtractor 
>>> url = "http://www.rob389.com/dp/tr/11/9789754681383" 
>>> isbnExtractor(url) 
9789754681383 
+0

感謝您的回覆,但我不認爲這回答了我的問題。我試圖解析網頁的**內容**。 –

+0

我看不出這個例子如何顯示如何使用BS。 –

1

該頁面是非常無效的XML,所有正常的方法使用parse()lxml.tree其次是xpath等失敗慘不忍睹。所以看起來像你最好的賭注是這樣的:

>>> import re 
>>> import urllib 
>>> import pprint 
>>> s = urllib.urlopen("http://www.rob389.com/dp/tr/11/9789754681383").read() 
>>> magic = re.compile(r'tOBJ.DATA\[0\].([A-Z0-9_]+)="([^"]+)"') 
>>> my_dict = dict(magic.findall(s)) 
>>> pprint.pprint(my_dict) 
{'DISC_PERC': '15.0000000000', 
'EXCHANGE_RT': '2.2815', 
'LNK_PREFIX': 'uykusuz-bir-gece-jill-murphy', 
'LST_PRICE': '7.500000000000000', 
'LST_YAX02_CODE': 'YTL', 
'MMG00_CODE': '11', 
'MMG00_TITLE': 'Kitap', 
'MMM00_DESC': '...<br />Cad\xfdlar Okulu M\xfcd\xfcr\xfc, \\', 
'MMM00_DESC250': '...<br />Cad\xfdlar Okulu M\xfcd\xfcr\xfc, \\', 
'MMM00_DISC_PERC_SAL': '25', 
'MMM00_HEIGHT': '19.6', 
'MMM00_ITEM_CODE': '9789751028440', 
'MMM00_ORG_TITLE': '026512', 
'MMM00_SRC_CODE': '9789754681383', 
'MMM00_TITLE': 'Uykusuz Bir Gece', 
'MMM00_TYPE': 'M', 
'MMM00_WEIGHT': '0', 
'MMM00_WIDTH': '13.6', 
'MMM00_ZHEIGHT': '1', 
'MMS03_PRICE_1': '7.500000000000000', 
'MMS03_PRICE_2': '0.000000000000000', 
'MMS03_PRICE_3': '7.500000000000000', 
'MMS03_YAX02_CODE_1': 'YTL', 
'MMS03_YAX02_CODE_2': 'YTL', 
'MMS03_YAX02_CODE_3': 'YTL', 
'NWS01_DESC': "<BR>New Orleans'da do\xf0an Lillian Hellman'\xfdn ilkgen\xe7li\xf0i daha sonra oyunlar\xfdnda \xfcst\xfc kapal\xfd olarak yer bulacak olan tuhaf ve h\xfdrsl\xfd akrabalar aras\xfdnda ge\xe7ti. New Orleans ve New York aras\xfdnda mekik dokuyarak ge\xe7en y\xfdllarda etraf\xfdndaki farkl\xfd k\xfclt\xfcrleri g\xf6zlemleme \xfeans\xfd buldu. Liseyi bitirdikten sonra Columbia ve New York \xdcniversitesi'ne devam ettiyse de, e\xf0itimini yar\xfdda b\xfdrakarak bir yay\xfdnevinde \xe7al\xfd\xfemaya ba\xfelad\xfd. 1920'lerin bohem hayat\xfdna g\xf6z k\xfdrpt\xfd\xf0\xfd bu d\xf6nemde tan\xfd\xfet\xfd\xf0\xfd gen\xe7 yazar Arthur Kober ile evlenerek Hollywood'a ta\xfe\xfdnd\xfd. <BR><BR>1930'lar\xfdn ba\xfe\xfdnda MGM'de d\xfczeltmenlik yapt\xfd. Hevesli bir solcu oldu\xf0u bu y\xfdllarda, i\xfe arkada\xfelar\xfdn\xfd sendikala\xfemalar\xfd i\xe7in<A class=A2 href=\\", 
'NWS01_DESC400': '<A class=A3 href=\\', 
'NWS01_ID': '588', 
'NWS01_IMAGE': '/UD_OBJS/IMAGES/NWS/HSTTR/Hellman_L_231204_365_1.jpg', 
'ON_ESHOP': 'T', 
'PEP01_ID': '229016', 
'PEP01_NAME': 'Jill Murphy', 
'PRD_FNM01_ID': '23462', 
'PRD_FNM01_TITLE': 'Mandolin', 
'PRD_FNM01_TRD_TITLE': 'Say Yay\xfdnlar\xfd', 
'PUR_VAT_VALUE': '8', 
'SAL_PRICE': '6.3750000000', 
'SAL_VAT_VALUE': '8', 
'SAL_YAX02_CODE': 'YTL', 
'UD_10': '~410~|', 
'UD_10_VAL': 'T\xfcrk\xe7e', 
'UD_11': '~1000~|~803.2~|', 
'UD_11_VAL': '\xc7ocuk,\xd6yk\xfc', 
'UD_12': '~1000.4080~|', 
'UD_12_VAL': '\xc7ocuk | 07-12 Ya\xfe | Edebiyat', 
'UD_15': '978-975-468-138-3', 
'UD_15_VAL': '978-975-468-138-3', 
'UD_16': '~PB~|', 
'UD_16_VAL': 'Karton Kapak', 
'UD_19': '01/01/2010', 
'UD_19_VAL': '01/01/2004', 
'UD_2': 'The Worst Witch Strikes Again', 
'UD_20': '92', 
'UD_20_VAL': '92', 
'UD_21': '52', 
'UD_21_VAL': '52', 
'UD_22': '3', 
'UD_22_VAL': '3', 
'UD_23': '1', 
'UD_23_VAL': '1', 
'UD_24': '~HM1~|', 
'UD_24_VAL': '1. Hamur', 
'UD_26': '7-12', 
'UD_26_VAL': '07-12', 
'UD_2_VAL': 'The Worst Witch Strikes Again', 
'UD_3': '~229016~|', 
'UD_30': '1', 
'UD_30_VAL': '1', 
'UD_31': '1', 
'UD_31_VAL': '1', 
'UD_34': '~1~|', 
'UD_34_VAL': '1-3 G\xfcn', 
'UD_36': '1', 
'UD_36_VAL': '1', 
'UD_39': 'VAR', 
'UD_39_VAL': 'Var', 
'UD_3_VAL': 'Jill Murphy', 
'UD_42': '~410~|', 
'UD_42_VAL': 'T\xfcrk\xe7e', 
'UD_6': '~239986~|', 
'UD_6_VAL': 'Seza Sunar', 
'YAX02_CODE': 'EUR'} 
>>> 
+0

謝謝你的回答,我選擇了更早的這是公平的),但不用說,這一個也回答這個問題。 –

+0

是的,完全公平。 – Kimvais