2017-07-06 88 views
0

我試圖使用Beautiful Soup 4和URLLIB作爲個人項目來抓取Stack Overflow作業頁面。我正面臨着一個問題,我試圖抓住每頁上列出的50個職位的所有鏈接。我正在使用正則表達式來識別這些鏈接。即使我正確地引用標籤,我面對這兩個具體問題:蟒蛇 - 使用BeautifulSoup發佈刮瑕

  1. 取而代之的是50個鏈接在源代碼中清晰可見的,我一次比一次只有25結果我的輸出(佔比之後刪除初始不相關的鏈接)

  2. 鏈接在源代碼和我的輸出中排序的方式有所不同。

這是我的代碼。任何幫助,將不勝感激:

import bs4 
import urllib.request 
import re 


#Obtaining source code to parse 

sauce = urllib.request.urlopen('https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab&sort=p&pg=0').read() 

soup = bs4.BeautifulSoup(sauce, 'html.parser') 

snippet = soup.find_all("script",type="application/ld+json") 
strsnippet = str(snippet) 

print(strsnippet) 

joburls = re.findall('https://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', strsnippet) 

print("Urls: ",joburls) 
print(len(joburls)) 

回答

0

免責聲明:我做了我自己的一些asking對這個答案的一部分。

from bs4 import BeautifulSoup 
import requests 
import json 

# note: link is slightly different; yours just redirects here 
link = 'https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab&sort=p' 
r = requests.get(link) 
soup = BeautifulSoup(r.text, 'html.parser') 

s = soup.find('script', type='application/ld+json') 
urls = [el['url'] for el in json.loads(s.text)['itemListElement']] 

print(len(urls)) 
50 

過程:

  1. 使用soup.find而非soup.find_all。這將給一個JSON bs4.element.Tag
  2. json.loads(s.text)是一個嵌套字典。訪問itemListElement鍵的值以獲取urls字典,並轉換爲列表。