2つの関数から2つのフィールドのみを出力しようとしています。両方の関数は同じURLを取りますが、異なる結果を生成します。最初の関数get_names()
は、さまざまなユーザーの名前を出力します。2番目の関数get_badges()
は、関係するユーザーに接続されているバッジの数を生成します。バッジの数は必ずしもすべてのユーザーに存在するとは限らzip_longest()
ないため、バッジを持っていないユーザーがいる場合に関数が印刷されるように使用しましたNone
。ただし、問題は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)
2つの関数で正確な結果を生成するにはどうすればよいですか?
上述したように、あなたは結果から、「接続している」ことを何か必要get_names()
としますget_badges()
。あなたのコードには、そのようなものはありません-そのため、結果はzipで不一致になります。
このコードで.user-details
は、2つの関数間の共通要素としてCSSセレクターを使用しています。コードでは、ユーザー名やユーザーIDなどの形式で共通の要素を持ち、各関数から辞書/タプルを返すことができます。
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.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加