如何在Python中解析这个网页(并转换成字典)

2024-06-16 10:36:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从某个网页(在线书店)获取一些数据。在

网页如下:http://www.rob389.com/dp/tr/11/9789754681383

我想分析包含以下字符串的<script>部分:

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

其中9789754681383是ISBN编号。在

我首先需要找到并提取正确的<script>部分。在

然后,我想遍历tOBJ.数据[0]对象并将其转换为如下字典:

^{pr2}$

等等。。。在

我想用python可以用很少的行来完成,但是我无法理解。在

有什么建议吗?在

提前谢谢。在

附言:欢迎任何其他解析建议。在


Tags: 数据字符串comhttp网页datawwwscript
3条回答

这个页面是如此的无效,以至于所有使用parse()from{}后跟{}等的普通方法都失败了。看来你最好的选择是:

>>> 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'}
>>> 

我几乎总是推荐使用beauthoulsoup—但是,这个页面似乎有一个“<;!>;'标记已下移一半,这会杀死解析器。所以,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个词条的字典,包括

^{pr2}$

如果要将其限制为仅限于以“MMM00”开头的键,请尝试

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

它只返回15个项目。在

您可以使用BeautifulSoup和一些代码来完成:

from bs4 import BeautifulSoup
import urllib2
from urlparse import urlsplit

def isbnExtractor(url):

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

这应该能解决问题。像这样:

^{pr2}$

相关问题 更多 >