网页抓取:雅虎提供dirtyurl而不是普通url

2024-05-19 16:24:42 发布

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

我使用mechanize从yahoo搜索中获取顶级结果并从中获取数据,但yahoo只提供dirtyurls,这会在进一步处理时出错,有没有获得原始链接的解决方案

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


Tags: recomhttpsearchroruyahoork
1条回答
网友
1楼 · 发布于 2024-05-19 16:24:42

假设您可以轻松地隔离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]

最后,您可以从urllib2包(https://docs.python.org/2/library/urllib.html#urllib.unquote)中使用unquote

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

您也不能通过在fields上循环并检查它是否以RU=开头来假定URL总是在第六个字段中

相关问题 更多 >