我在抓取GitHub用户的星星时出错,任何人都可以帮助我解决这个问题。我用的是python。我的代码
def total_stars(username):
html = requests.get('https://github.com/'+username ).text
soup = BeautifulSoup(html, 'html.parser')
total_commit = soup.select_one('text-bold color-fg-default + span').text
print(total_commit)
误差
AttributeError: 'NoneType' object has no attribute 'text'
您几乎得到了答案@lex,您想要通过html来获取元素的方式需要放入您的select_one()
或select()
调用中。
像下面,
>>> soup.select_one('#js-pjax-container > div.container-xl.px-3.px-md-4.px-lg-5 > div > div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 > div > div.js-profile-editable-replace > div.d-flex.flex-column > div.js-profile-editable-area.d-flex.flex-column.d-md-block > div.flex-order-1.flex-md-order-none.mt-2.mt-md-0 > div > a:nth-child(3) > span').text
或
>>> soup.select_one('#js-pjax-container div.container-xl.px-3.px-md-4.px-lg-5 div div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 div div.js-profile-editable-replace div.d-flex.flex-column div.js-profile-editable-area.d-flex.flex-column.d-md-block div.flex-order-1.flex-md-order-none.mt-2.mt-md-0 div a:nth-child(3) span').text
或
>>> soup.select('#js-pjax-container > div.container-xl.px-3.px-md-4.px-lg-5 > div > div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 > div > div.js-profile-editable-replace > div.d-flex.flex-column > div.js-profile-editable-area.d-flex.flex-column.d-md-block > div.flex-order-1.flex-md-order-none.mt-2.mt-md-0 > div > a:nth-child(3) > span')[0].text
:
'16'
注意:这是基于你的评论。
使用一个不那么敏感的路径,不要使用一个即使是很小的站点/html更改的路径。较长的标识符链很容易断裂。
"stars"号码是在一个链接到一个标签的用户的个人资料(星号repos),如https://github.com/aneroid?tab=stars
。你已经有了用户名&url。
因此,将选择器简化为更健壮的东西:a[href="https://github.com/aneroid?tab=stars"] > span
代码将变成:
def total_stars(username):
url = 'https://github.com/' + username
html = requests.get(url).text
soup = BeautifulSoup(html, 'html.parser')
# it's not `total_commit`, that's in your other function ;-)
stars = soup.select_one(f'a[href="{url}?tab=stars"] > span').text
print(stars)
# return int(stars)
顺便说一句,followers
和following
链接有一个类似的结构,所以?tab=followers
和?tab=following
如果你也想要它们。