【问题标题】:Python - Issue Scraping with BeautifulSoupPython - 使用 BeautifulSoup 进行问题抓取
【发布时间】:2017-07-06 19:27:01
【问题描述】:

我正在尝试使用 Beautiful Soup 4 和 URLLIB 作为个人项目来抓取 Stack Overflow 工作页面。我正面临一个问题,我试图抓取每页上列出的 50 个工作的所有链接。我正在使用正则表达式来识别这些链接。即使我正确引用了标签,我也面临这两个具体问题:

  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]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', strsnippet)

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

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup urllib


    【解决方案1】:

    免责声明:我为这个答案的一部分做了一些自己的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 键的值以获取 url 的字典,并转换为列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2020-10-04
      • 2015-03-29
      相关资源
      最近更新 更多