蟒蛇 - 使用BeautifulSoup发布刮瑕

蟒蛇 - 使用BeautifulSoup发布刮瑕

问题描述:

我试图使用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://*.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)) 

免责声明:我做了我自己的一些asking对这个答案的一部分。

from bs4 import BeautifulSoup 
import requests 
import json 

# note: link is slightly different; yours just redirects here 
link = 'https://*.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字典,并转换为列表。