2014-11-14 57 views
1

我正在使用機械化來從雅虎搜索獲得最佳結果並從它們中提取數據,但雅虎只提供dirtyurls,這會給進一步處理帶來錯誤,任何獲得原創的解決方案鏈接?Web Scrapping:雅虎提供dirtyurl,而不是普通的url

例如:對於結果stackoverflow.com,我得到下面的標籤

<a dirtyhref="http://r.search.yahoo.com/_ylt=A0SO8zEuKGZUteYAEHRXNyoA;_ylu=X3oDMTEzODh2cDk0BHNlYwNzcgRwb3MDMQRjb2xvA2dxMQR2dGlkA1ZJUDI0NF8x/RV=2/RE=1416009903/RO=10/RU=http%3a%2f%2fstackoverflow.com%2f/RK=0/RS=a.mWRIy6IMjJQysgixByd8053hE-" id="link-1" class="yschttl spt" href="http://r.search.yahoo.com/_ylt=A0SO8zEuKGZUteYAEHRXNyoA;_ylu=X3oDMTEzODh2cDk0BHNlYwNzcgRwb3MDMQRjb2xvA2dxMQR2dGlkA1ZJUDI0NF8x/RV=2/RE=1416009903/RO=10/RU=http%3a%2f%2fstackoverflow.com%2f/RK=0/RS=a.mWRIy6IMjJQysgixByd8053hE-" target="_blank" data-bk="5054.1"> <b>Stack Overflow</b> - Official Site </a>

所以這裏 http://r.search.yahoo.com/_ylt=A0SO8zEuKGZUteYAEHRXNyoA;_ylu=X3oDMTEzODh2cDk0BHNlYwNzcgRwb3MDMQRjb2xvA2dxMQR2dGlkA1ZJUDI0NF8x/RV=2/RE=1416009903/RO=10/RU=http%3a%2f%2fstackoverflow.com%2f/RK=0/RS=a.mWRIy6IMjJQysgixByd8053hE-

代表http://stackoverflow.com

回答

2

假設你可以隔離的輕鬆內容dirtyhref(您可以使用BeautifulSoup解析鏈接,http://www.crummy.com/software/BeautifulSoup/bs4/doc/),您可以使用urlparse包僅獲取路徑(https://docs.python.org/2/library/urlparse.html#urlparse.urlparse)。現在你要它像一個字符串:

dirty_href = "/_ylt=A0SO8zEuKGZUteYAEHRXNyoA;_ylu=X3oDMTEzODh2cDk0BHNlYwNzcgRwb3MDMQRjb2xvA2dxMQR2dGlkA1ZJUDI0NF8x/RV=2/RE=1416009903/RO=10/RU=http%3a%2f%2fstackoverflow.com%2f/RK=0/RS=a.mWRIy6IMjJQysgixByd8053hE-"\ 

現在,看來,我認爲字段由/分開的,所以您可以:

fields = dirty_href.split('/') 

假設你感興趣的領域總是第六:

dirty_url = fields[5].split('=')[1] 

最後,你可以使用unquoteurllib2包(https://docs.python.org/2/library/urllib.html#urllib.unquote):

>>> urllib2.unquote(dirty_url) 
'http://stackoverflow.com/' 

你也不能假設的網址始終是在第六個領域,通過循環過fields並檢查它是否與RU=開始。

+0

謝謝先生!它的工作 – T90 2014-11-16 11:47:37

+2

重複使用這個,我喜歡索引5不是一直都是一樣的,所以我想把這個添加到@Mikk的答案中,以防其他人需要它在字段中的一部分:if part.startswith('RU ='): url = urllib2.unquote(str(part).split('=')[1])' – T90 2014-11-17 11:33:02