2014-07-14 34 views
2

我試圖從亞馬遜的暢銷品列表中檢索URL和類別名稱。由於某種原因,我正在使用停止,當它遇到/ref=,我真的不明白爲什麼?我在Windows 7盒子上使用Python 2.7。Python RE不會返回任何東西/ ref =

一個典型的記錄是

<li><a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0">Appstore for Android</a></li> 

和我的RE是

Regex = "<li><a href='(http://www.amazon.ca/Best-Sellers.*?)'>(.*?)</a></li>" 
Category = re.compile(Regex) 

它返回一個元組

[][0] http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps 
[][1] Appstore for Android 

我得到了所有正確的記錄,但你可以看到,該網址缺少/ref=zg_bs_nav_0

類別層次結構中的其他級別表現出相同的問題;網址中的所有內容(包括/ ref =開頭)都缺失。

這裏是我的代碼片段我把馬亭的建議

# First page of the list of Best Sellers categories 
URL = "http://www.amazon.ca/gp/bestsellers" 

# Retrieve the page source 
HTMLFile = urllib.urlopen(URL) 
HTMLText = HTMLFile.read() 

soup = BeautifulSoup(HTMLText) 
for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'): 
    print link['href'] 
    print link.get_text() 

回答

4

您使用正則表達式,但這樣的表達式匹配XML變得太複雜了,太快了。不要這樣做。

使用HTML解析器來代替,Python有幾個選擇:

後兩者也很好地處理格式錯誤的HTML,使很多拙劣網站的體面感。實際上,如果安裝了BeautifulSoup 4,那麼它將使用底層的lxml作爲解析器。

BeautifulSoup例如:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(htmlsource) 
for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'): 
    print link['href'], link.get_text() 

這使用CSS選擇找到在其中href屬性與文本http://www.amazon.ca/Best-Sellers開始<li>元件直接包含所有<a>元素。

演示:

>>> from bs4 import BeautifulSoup 
>>> htmlsource = '<li><a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0">Appstore for Android</a></li>' 
>>> soup = BeautifulSoup(htmlsource) 
>>> for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'): 
...  print link['href'], link.get_text() 
... 
http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0 Appstore for Android 

注意,亞馬遜改變基於首迴應:

>>> import requests 
>>> from bs4 import BeautifulSoup 
>>> r = requests.get('http://www.amazon.ca/gp/bestsellers') 
>>> soup = BeautifulSoup(r.content) 
>>> soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]')[0] 
<a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps">Appstore for Android</a> 
>>> r = requests.get('http://www.amazon.ca/gp/bestsellers', headers={ 
...  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'}) 
>>> soup = BeautifulSoup(r.content) 
>>> soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]')[0] 
<a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0/185-3312534-9864113">Appstore for Android</a> 
+0

你好,這是快!我曾看過有人在YouTube視頻中使用BeautifulSoup,但沒有意識到正則表達式有多清潔。我想我有一些閱讀要做。有一件事,我仍然沒有得到/ ref = ...部分。 – PatrickR400

+0

@ PatrickR400:你的意思是當你使用BeautifulSoup?。那麼'