网页搜寻:雅虎提供脏网址而不是普通网址

时间:2014-11-14 16:14:18

标签: python web web-scraping yahoo

我使用机械化来获取雅虎搜索的最佳结果并从中获取废品数据,但是雅虎只提供了脏兮兮,这会给进一步处理带来错误,是否有获得原始链接的解决方案?

示例:对于结果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

1 个答案:

答案 0 :(得分: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]

最后,您可以使用unquote包中的urllib2https://docs.python.org/2/library/urllib.html#urllib.unquote):

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

您也不能假设该网址始终位于第六个字段中,方法是在fields上骑行,并检查它是否以RU=开头。