【问题标题】:Scraping a random word from randomlists.com BeautifulSoup从 randomlists.com BeautifulSoup 抓取一个随机单词
【发布时间】:2021-12-09 09:03:29
【问题描述】:

我的项目涉及我从https://www.randomlists.com/random-vocabulary-words 中抓取随机单词并使用从网站上抓取的单词创建一个多项选择题。

我需要抓取的数据位于 <div> 中,其中 class="Rand-stage",特别是它下面的 <ol> 标签。完成此操作后,我需要获取<ol> 下的<li> 标签中的单词。我附上了这张图片。 Image

目前,我的代码如下:

url = https://www.randomlists.com/random-vocabulary-words 
r = requests.get(url)
html_content = r.content
soup = bs4.BeautifulSoup(html_content, 'html.parser')

result = []
for li in soup.find('ol', class_='rand_large').find_all('li'):
    result.append(list(li.stripped_strings))

print(result)

现在,我不知道如何抓取 <ol> 标签中的内容,或者如果这是我首先需要抓取的内容,以获得随机单词(及其含义,也在<li>标签中)。

实际上,当代码运行时,它并没有显示任何输出。相反,它抛出了一个

错误(AttributeError: 'NoneType' 对象没有属性 'find_all')

【问题讨论】:

  • 看起来 rand_large
  • 标签中的一个类,而不是
      标签,所以第一个 soup.find 应该找不到任何东西。只是在做soup.find_all('li') 时,你是不是捡了太多垃圾?
  • 感谢您的回复,实际上,当代码运行时,它并没有显示任何输出。相反,它抛出了一个错误(AttributeError: 'NoneType' object has no attribute 'find_all')。
  • 标签: python web-scraping beautifulsoup


    【解决方案1】:

    会发生什么?

    内容由网站动态提供,因此您不会在 soup 中找到要搜索的元素。

    因此出现以下错误,导致soup.find('ol', class_='rand_large') 在响应中找不到该元素,这就是为什么您的find_all() 也失败了:

    AttributeError: 'NoneType' 对象没有属性 'find_all'

    如何解决?

    以下行将为您提供一组随机的 3 个带有单词和详细信息的字典:

    random.choices(r.json()['data'], k=3)
    

    示例

    import requests, random
    
    url =  'https://www.randomlists.com/data/vocabulary-words.json'
    r = requests.get(url)
    
    random.choices(r.json()['data'], k=3)
    

    输出

    [{'name': 'attenuate', 'detail': 'make thin. weaken enervate'},
     {'name': 'savant', 'detail': 'person of great learning'},
     {'name': 'fledged', 'detail': 'able to fly trained experienced'}]
    

    【讨论】:

    • 非常感谢!我会立即尝试并更新
    • 我刚刚运行了代码,它抛出了另一个错误,NameError: name 'headers' is not defined。这里的“标题”是什么,我如何定义它?我以前没有使用过 .json,所以我有点困惑。
    • 我的错 - 编辑了示例,您不必提供标题,它来自我的标准设置 - 对此表示歉意。
    • 成功了!非常感谢!你帮了大忙,我现在可以继续我的项目了:)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签