python - 一些函数给出了错误的结果而不是 None

标签 python python-3.x web-scraping

我试图从两个函数中只打印两个字段。这两个函数采用相同的 url,但产生不同的结果。第一个函数 get_names() 打印不同用户的名称。第二个函数 get_badges() 生成与相关用户关联的徽章数量。 由于徽章的数量并不总是出现在每个用户身上,我使用了 zip_longest() 这样如果任何用户没有任何徽章,该函数将打印 。然而,问题是 get_badges() 函数在遇到任何没有任何徽章的用户时给我错误的结果。

我试过:

import requests
from bs4 import BeautifulSoup
from itertools import zip_longest

url = 'https://stackoverflow.com/questions/tagged/web-scraping'

def get_names(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".user-details > a"):
        yield item.text

def get_badges(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".badgecount"):
        yield item.text

if __name__ == '__main__':
    for elem in zip_longest(get_names(url),get_badges(url)):
        print(elem)

如何让这两个函数产生准确的结果?

  • 注意:我使用两个 API,它们针对不同的 ID 产生不同的结果(相关)。我只是试图模仿与我正在使用这些 API 所做的相同的逻辑。

最佳答案

如上所述,您需要一些东西来“连接”来自 get_names()get_badges() 的结果。在您的代码中,没有类似的东西 - 因此 zip 中的结果将不匹配。

在这段代码中,我使用 CSS 选择器 .user-details 作为两个函数之间的公共(public)元素。在您的代码中,您可以使用用户名或用户 ID 等形式的公共(public)元素,并从每个函数返回一个字典/元组:

import requests
from bs4 import BeautifulSoup

url = 'https://stackoverflow.com/questions/tagged/web-scraping'

def get_names(soup):
    for item in soup.select(".user-details > a"):
        yield item.text

def get_badges(soup):
    for item in soup.select(".user-details"):
        gold = item.select_one('.badge1 + .badgecount')
        silver = item.select_one('.badge2 + .badgecount')
        bronze = item.select_one('.badge3 + .badgecount')

        yield [int(gold.text) if gold else 0,
               int(silver.text) if silver else 0,
               int(bronze.text) if bronze else 0]

if __name__ == '__main__':

    res = requests.get(url)
    soup = BeautifulSoup(res.text,"lxml")

    print('{: <30}{: >5}{: >5}{: >5}'.format('Name', 'G', 'S', 'B'))
    print('-' * 45)
    for name, badges in zip(get_names(soup), get_badges(soup)):
        print('{: <30}{}'.format(name, ''.join('{: >5}'.format(b) for b in badges)))

打印:

Name                              G    S    B
---------------------------------------------
Arkadi w                          0    0    7
MITHU                             0    4   18
Mohamed Suhail Irfan Khazi        0    0    2
Kevin Walsh                       0    0    2
lowpeasant                        0    0    0
vivekh99                          0    0    2
Nico Gandolfo                     0    0    1
Sam Edeus                         0    0    2
Tab Key                           0    0    7
Ion Aag                           0    0    5

... and so on.

关于python - 一些函数给出了错误的结果而不是 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57587350/

相关文章:

python - BeautifulSoup - 解析不返回预期的标签

ruby - 无方法错误 : ruby gem mechanize undefined method 'q= '

python - 在 Python 中将对象标记为已删除

python - PyCharm 无法解析 PyGObject 3.0,但代码运行正常

python - 向 Odoo 11.0 帐户发票添加额外字段

python - 文件未找到错误 : [WinError 2] python 3. 4

python-3.x - Pytorch DataLoader 多数据源

R网络抓取包无法读取所有url表

python - 使用 Python 从 HTML 中提取字符串不适用于正则表达式或 BeautifulSoup

Python DB API 列表表