我试图从两个函数中只打印两个字段。这两个函数采用相同的 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/