代码中刮取的数据与网站中的数据不匹配

时间:2019-06-27 23:28:37

标签: python beautifulsoup python-requests

我正在尝试创建一个程序,该程序每月从https://namemc.com/minecraft-names的搜索次数中抓取用户名列表。您可以使用搜索栏在网站上轻松完成此操作,并将您带到URL https://namemc.com/minecraft-names?length_op=&length=3&lang=en&searches=50。我知道我的代码可能效率极低,但是由于我对beautifulsoup不熟悉,所以我不确定有其他方法可以执行我想要的操作。这是我用来抓取姓名的代码。

def get_names(searches, n_names):
    url = 'https://namemc.com/minecraft-names?length_op=&length=3&lang=en&searches=' + str(searches)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")

    names = []
    for element in soup.find_all("div", attrs={"class": "col col-md order-md-1 text-nowrap"}):
        if len(names) >= n_names and not all_names:
            return names
        names.append(element.text)
    return names

预期结果是搜索次数超过searches

的所有名称的列表

实际结果是原始网址中所有名称的列表

1 个答案:

答案 0 :(得分:0)

您没有提供正确的div属性(据我了解您的需求)。通过这样更改div属性

soup.find_all("div", attrs={"class": "row no-gutters py-1 px-3 border-top"}

我已经得到了排序的输出(一个div元素)

<div class="row no-gutters py-1 px-3 border-top">
<div class="col col-md order-md-1 text-nowrap"><a href="/name/xMilouu_" translate="no">xMilouu_</a></div>
<div class="col-auto col-md order-md-3 text-right">‒</div>
<div class="col-12 col-md-5 order-md-2 text-md-center"><time datetime="2019-06-28T14:34:55.000Z">2019-06-28T14:34:55.000Z</time></div>

您可以使用

name, search, time = element.text.strip().split("\n")

从得到的这一行打印变量(每个元素一行)

name: _Delta_Phoenix_    search: ‒   time: 2019-06-28T14:56:01.000Z
name: 1Destruction   search: 3   time: 2019-06-28T14:56:01.000Z
name: Pichu1028      search: 1   time: 2019-06-28T14:56:02.000Z

然后将所需的内容应用

编辑:并进行更正,这将忽略发现的最高用户(基于其HTML代码),您可以通过

与他联系
soup.find_all("div", attrs={"class": "row no-gutters py-1 px-3"}

对我来说只返回1个用户