如何通过网络抓取所有击球手的名字?

时间:2018-09-20 03:07:27

标签: python xpath web-scraping lxml

我想抓取所有2018年美国职业棒球大联盟击球手的统计信息。这是到目前为止的代码:

#import modules

from urllib.request import urlopen
from lxml import html

#fetch url/html

response = urlopen("https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml")
content = response.read()
tree = html.fromstring( content )

#parse data

comment_html = tree.xpath('//comment()[contains(., "players_standard_batting")]')[0]
comment_html = str(comment_html).replace("-->", "")
comment_html = comment_html.replace("<!--", "")
tree = html.fromstring( comment_html )
for batter_row in tree.xpath('//table[@id="players_standard_batting"]/tbody/tr[contains(@class, "full_table")]'):
    csk = batter_row.xpath('./td[@data-stat="player"]/@csk')[0]

当我刮所有面糊时,每个名字后面都附有0.01。我尝试使用以下代码删除附加的号码:

bat_data = [csk]
string = '0.01'
result = []

for x in bat_data :
    if string in x:
        substring = x.replace(string,'')
        if substring != "":
            result.append(substring)
    else:
        result.append(x)
print(result)

此代码删除了该号码,但是只打印了姓氏:

输出:

['Zunino, Mike']

此外,名称周围还有一个括号和引号。名称也以相反的顺序。

1)如何打印所有击球手的名字?

2)如何删除引号和括号?

3)我可以颠倒名称的顺序,以便先打印名字然后再打印姓氏吗?

我希望的最终输出将是所有击球手的名字,例如:Mike Zunino。

我是这个网站的新手...我还是抓取/编码的新手,将非常感谢我能提供的任何帮助! =)

3 个答案:

答案 0 :(得分:0)

1)打印所有击球员名

import { h } from 'preact'

这将打印结果对象中的所有内容。如果没有打印出您所期望的内容,则说明存在其他错误。

2)删除报价 括号是由于它是数组对象。试试这个...

print(result)

这将告诉解释器在0索引处打印结果。

3)名称的相反顺序

尝试

print(result[0])

答案 1 :(得分:0)

您只会得到最后一个击球手,因为您在第一个循环中每次都会覆盖csk的值。首先初始化空列表bat_data,然后向其中添加每个面糊。

bat_data= []
for batter_row in blah:
    csk = blah
    bat_data.append(csk)

这将为您提供所有连击者的清单,['Abreu,Jose0.01', 'Acuna,Ronald0.01', 'Adam,Jason0.01', ...]

然后遍历此列表,但是您不必检查string是否在名称中。只需执行x.replace('0.01', ''),然后检查字符串是否为空即可。

颠倒名称顺序

substring = substring.split(',')
substring.reverse()
nn = " ".join(substring)

然后将nn附加到结果中。

因为要打印列表,所以得到了引号和括号。而是遍历列表并打印每个项目。

假设您正确输入了bat_data,您的代码已编辑:

for x in bat_data :
    substring = x.replace(string,'')
    if substring != "":
        substring = substring.split(',')
        substring.reverse()
        substring = ' '.join(substring)
        result.append(substring)

for x in result:
    print(x)

答案 2 :(得分:0)

您可以用不同的方式进行相同的操作。这是一种不需要后期处理的方法。您会得到想要的名称:

from urllib.request import urlopen
from lxml.html import fromstring

url = "https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml"

content = str(urlopen(url).read())
comment = content.replace("-->","").replace("<!--","")
tree = fromstring(comment)
for batter_row in tree.xpath('//table[contains(@class,"stats_table")]//tr[contains(@class,"full_table")]'):
    csk = batter_row.xpath('.//td[@data-stat="player"]/a')[0].text
    print(csk)

您可能会得到的输出:

Jose Abreu
Ronald Acuna
Jason Adam
Willy Adames
Austin L. Adams