我刚开始学习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
所以我的问题是两部分:
如何从结果中删除重复项?
如何返回完整的网址而不仅仅是路径?
第二个问题是我最感兴趣的问题。如果需要,我可以稍后在Bash中过滤掉重复项。
此外,对此脚本的任何和所有建设性批评都是受欢迎的。 :)
答案 0 :(得分:4)
它确实会返回它在页面上找到的链接的内容。
以http
开头的是指向它找到的网站的链接。其他是内部链接,相对于搜索页面本身 - 在这种情况下,它们指向搜索引擎提供的其他搜索选项。
如果您想制作这些绝对网址,则需要将其与您发送的原始网址一起加入:
from urllib.request import urljoin
...
if not link.startswith('http'):
link = urljoin(url, link)