我正在尝试创建一个程序,该程序每月从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
实际结果是原始网址中所有名称的列表
答案 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个用户