2014-11-14 60 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