【问题标题】:Web Scraping : Yahoo provides dirtyurl instead of normal urlWeb Scraping :Yahoo 提供dirtyurl 而不是普通的url
【发布时间】:2015-01-12 02:19:35
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: python web web-scraping yahoo


    【解决方案1】:

    假设您可以轻松隔离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 包中的unquote (https://docs.python.org/2/library/urllib.html#urllib.unquote):

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

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

    【讨论】:

    • 反复使用这个,我喜欢索引 5 一直不一样,所以我想把这个添加到@Mikk 的答案中,以防其他人需要它for part in fields: if part.startswith('RU='): url = urllib2.unquote(str(part).split('=')[1])
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多