使用BeautifulSoup获取完整的URL而不是仅使用路径

时间:2017-06-10 19:43:25

标签: python

我刚开始学习Python,我正在尝试使用BeautifulSoup编写脚本。这是我到目前为止所做的:

#!/usr/bin/python

from bs4 import BeautifulSoup
from six.moves import urllib
import ssl

sitelist = [
'https://www.google.com/search?q=%s',
'https://www.bing.com/search?q=%s',
'http://www.ask.com/web?q=%s',
'https://duckduckgo.com/?q=%s'
]

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

query = raw_input("What do you want to search for? ")

for url in sitelist:
    url = url % (query)
    try:
        result = urllib.request.urlopen(url, context=ctx)
        soup = BeautifulSoup(result, "lxml")

        for link in soup.find_all('a'):
            link = link.get('href')
            try:
                if query in link:
                    print(link)
            except:
                pass
    except:
        pass

因此,当我运行此脚本时,如果我搜索“stackoverflow”,我会得到如下结果:

/images/search?q=stackoverflow&FORM=HDRSC2
/videos/search?q=stackoverflow&FORM=HDRSC3
/maps?q=stackoverflow&mkt=en&FORM=HDRSC4
https://stackoverflow.com/
https://stackoverflow.com/questions/

然后在列表的后面再次出现一些相同的结果。我理解为什么会这样。使用多个搜索引擎的相同搜索将产生重复的结果。我不明白的是结果好坏参半。其中一些是完整的网址。但是其他结果只包含路径,例如

/images/search?q=stackoverflow&FORM=HDRSC2
/videos/search?q=stackoverflow&FORM=HDRSC3
/maps?q=stackoverflow&mkt=en&FORM=HDRSC4

所以我的问题是两部分:

  1. 如何从结果中删除重复项?

  2. 如何返回完整的网址而不仅仅是路径?

  3. 第二个问题是我最感兴趣的问题。如果需要,我可以稍后在Bash中过滤掉重复项。

    此外,对此脚本的任何和所有建设性批评都是受欢迎的。 :)

1 个答案:

答案 0 :(得分:4)

它确实会返回它在页面上找到的链接的内容。

http开头的是指向它找到的网站的链接。其他是内部链接,相对于搜索页面本身 - 在这种情况下,它们指向搜索引擎提供的其他搜索选项。

如果您想制作这些绝对网址,则需要将其与您发送的原始网址一起加入:

from urllib.request import urljoin

...

if not link.startswith('http'):
    link = urljoin(url, link)