我想做一些我在Reddit上看到的東西,它可以讓你獲得一個隨機的維基百科文章,看到它的標題,然後A(在你的瀏覽器中打開文章)或B(獲得一個新的隨機文章)。要獲得一篇隨機文章,你可以輸入這個網址「https://en.wikipedia.org/wiki/Special:Random」,但是之後我需要重新加載網址,看看它改變了什麼,然後弄清楚我得到了什麼文章。我將如何做到這一點?如何加載網頁(不在瀏覽器中)然後獲取該網頁的網址?
0
A
回答
0
的Site:Random
頁面在維基百科返回redirection response與目標位置:
HTTP/1.1 302 Found
...
Location: https://en.wikipedia.org/wiki/URL_redirection
...
大多數圖書館(和所有瀏覽器)自動跟隨該鏈接,但您可以禁用它,例如,在requests:
import requests
url = 'https://en.wikipedia.org/wiki/Special:Random'
response = requests.get(url, allow_redirects=False)
real_url = response.headers['location']
# then use real_url to fetch the page
另外,requests
提供重定向歷史:
response = requests.get(url)
real_url = response.history[-1].headers['location']
在後一種情況下,response
已包含您需要的頁面,因此這是一種更簡單的方法。
0
- 網址 - 你可以得到的urllib2 response.geturl()
- 維基頭中的URL - 您可以解析與BeautifulSoup包
- 瀏覽器的標題 - 你可以在Web瀏覽器中打開URL在webbrowser.open(URL)
這是一個簡單的工作例如:
import urllib2
import webbrowser
from BeautifulSoup import BeautifulSoup
while (True):
response = urllib2.urlopen('https://en.wikipedia.org/wiki/Special:Random')
headline = BeautifulSoup(response.read()).html.title.string
url = response.geturl()
print "The url: " +url
print "The headline: " + headline
x = raw_input("Press: [A - Open in browser] [B - Get a new random article] [Anything else to exit]\n>")
if x == "A":
webbrowser.open(url) #open in browser
elif x == "B":
continue # get a new random article
else:
break #exit
0
溴eaking任務分解成一口大小的塊:
獲得一個隨機的維基百科文章
酷。這非常簡單。您可以使用Python的內置urllib2
或requests
軟件包。大多數人推薦requests
(pip install requests
),因爲它是一個更高級的庫,使用起來更簡單一些,但在這種情況下,我們所做的事情非常簡單,可能會過度。無論如何:
import requests
RANDOM_WIKI_URL = "https://en.wikipedia.org/wiki/Special:Random"
response = requests.get(RANDOM_WIKI_URL)
data = response.content
url = response.url
看到它的標題
爲此,我們需要解析HTML。人們很容易建議您只需使用正則表達式來提取包含標題,但真正做這種事情的正確方法元素中的文本是使用像BeautifulSoup
庫(pip install beautifulsoup4
):
from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
title = soup.select('#firstHeading')[0].get_text()
print title
A([...])或B([...]])
print "=" * 80
print "(a): Open in new browser tab"
print "(b): Get new article"
print "(q): Quit"
user_input = raw_input("[a|b|q]: ").lower()
if user_input == 'a':
...
elif user_input == 'b':
...
elif user_input == 'q':
...
在瀏覽器中打開文章
import webbrowser
webbrowser.open_new_tab(url)
得到一個新的隨機文章
response = requests.get(RANDOM_WIKI_URL)
data = response.content
url = response.url
全部放在一起:
from __future__ import unicode_literals
import webbrowser
from bs4 import BeautifulSoup
import requests
RANDOM_WIKI_URL = "https://en.wikipedia.org/wiki/Special:Random"
def get_user_input():
user_input = ''
while user_input not in ('a', 'b', 'q'):
print '-' * 79
print "(a): Open in new browser tab"
print "(b): Get new random article"
print "(q): Quit"
print '-' * 79
user_input = raw_input("[a|b|q]: ").lower()
return user_input
def main():
while True:
print "=" * 79
print "Retrieving random wikipedia article..."
response = requests.get(RANDOM_WIKI_URL)
data = response.content
url = response.url
soup = BeautifulSoup(data, 'html.parser')
title = soup.select('#firstHeading')[0].get_text()
print "Random Wikipedia article: '{}'".format(title)
user_input = get_user_input()
if user_input == 'q':
break
elif user_input == 'a':
webbrowser.open_new_tab(url)
if __name__ == '__main__':
main()
相關問題
- 1. 獲取C#中網頁瀏覽器的當前網址
- 2. 瀏覽器如何加載網頁?
- 3. 查找網頁瀏覽器的網址
- 4. 如何在網頁加載,然後單擊該網頁中的元素?
- 5. 從Chrome網頁瀏覽器獲取網址
- 6. Java:在網頁瀏覽器加載之前編輯網頁
- 7. 如何獲取初始網頁後加載的網頁元素?
- 8. 如何使用網頁框在網頁中獲取Flash網址?
- 9. 如何確定網頁是否完全在網頁瀏覽器中加載?
- 10. 如何獲取本網頁的網址
- 11. 在Blogger中獲取網頁的網址
- 12. 如何在瀏覽器中提供網址時將網頁上傳到網頁並顯示網頁?
- 13. 在後臺打開瀏覽器 - 在後臺加載網頁
- 14. 網頁瀏覽器內的網頁瀏覽器
- 15. 獲取網頁瀏覽器cookies登錄
- 16. buildozer不能下載網頁瀏覽器
- 17. 檢測網頁何時滿載網頁瀏覽器控件c#
- 18. 如何從網頁的網址中提取網站的網址?
- 19. 如何下載網頁源並在網頁瀏覽器中顯示?
- 20. 如何在windows phone中獲取網頁瀏覽器的網站內容?
- 21. 瀏覽網頁
- 22. 設置網頁瀏覽器加載的自定義HTML的網址
- 23. 如何發送網頁瀏覽器的加載頁面,然後一段時間後結果頁面
- 24. 如何使Xcode中的Web瀏覽器自動加載網頁
- 25. 獲取打開標籤頁的網址,瀏覽器
- 26. 我如何在不同的網頁瀏覽器中測試我的網頁
- 27. 在導出爲簽名後的網頁瀏覽器不加載頁面
- 28. 觸發的網頁瀏覽器下載
- 29. 在wpf網絡瀏覽器控件中瀏覽安全網頁
- 30. 如何獲得谷歌Chrome網頁瀏覽器活動標籤的網址(vb6)
有沒有辦法做到這一點,而不使用「請求」? –
@Beta_Penguin當然,這也可以用標準的'urllib2',就像@ dv1337所示。 – bereal