Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想用python脚本刮取数据_Python_Html_Python 3.x_Beautifulsoup_Python 3.4 - Fatal编程技术网

我想用python脚本刮取数据

我想用python脚本刮取数据,python,html,python-3.x,beautifulsoup,python-3.4,Python,Html,Python 3.x,Beautifulsoup,Python 3.4,我已经编写了python脚本来从中提取数据 这是一份100名玩家的名单,我成功地收集了这些数据。问题是,当我运行脚本而不是一次刮取数据时,它刮取相同的数据三次 1. – 澳大利亚 906 1. 选择表格并在其中查找div: maindiv = soup.select("#batsmen-tests div.text-center") for div in maindiv: print(div.text) 您的原始输出和上面的输出将div中的所有文本作为一行获取,如果您只需要播放器名

我已经编写了python脚本来从中提取数据 这是一份100名玩家的名单,我成功地收集了这些数据。问题是,当我运行脚本而不是一次刮取数据时,它刮取相同的数据三次


1.
–
澳大利亚
906
1.

选择表格并在其中查找div:

maindiv = soup.select("#batsmen-tests div.text-center")
for div in maindiv:
    print(div.text)
您的原始输出和上面的输出将div中的所有文本作为一行获取,如果您只需要播放器名称,这并不是真正有用的:

anchors = soup.select("#batsmen-tests div.cb-rank-plyr a")
for a in anchors:
    print(a.text)
以漂亮的csv格式获取数据的一种快速简便的方法是仅从每个子级获取文本:

maindiv = soup.select("#batsmen-tests div.text-center")
for d in maindiv[1:]:
    row_data = u",".join(s.strip() for s in filter(None, (t.find(text=True, recursive=False) for t in d.find_all())))
    if row_data:
        print(row_data)
现在您可以得到如下输出:

# rank, up/down, name, country, rating, best rank
1,–,Steven Smith,AUSTRALIA,906,1
2,–,Joe Root,ENGLAND,878,1
3,–,Kane Williamson,NEW ZEALAND,876,1
4,–,Hashim Amla,SOUTH AFRICA,847,1
5,–,Younis Khan,PAKISTAN,845,1
6,–,Adam Voges,AUSTRALIA,802,5
7,–,AB de Villiers,SOUTH AFRICA,802,1
8,–,Ajinkya Rahane,INDIA,785,8
9,2,David Warner,AUSTRALIA,772,3
10,–,Alastair Cook,ENGLAND,770,2
11,1,Misbah-ul-Haq,PAKISTAN,764,6
与之相反:

PositionPlayerRatingBest Rank
Player
1    –Steven SmithAUSTRALIA9061
2    –Joe RootENGLAND8781
3    –Kane WilliamsonNEW ZEALAND8761
4    –Hashim AmlaSOUTH AFRICA8471
5    –Younis KhanPAKISTAN8451
6    –Adam VogesAUSTRALIA8025

选择表格并在其中查找div:

maindiv = soup.select("#batsmen-tests div.text-center")
for div in maindiv:
    print(div.text)
您的原始输出和上面的输出将div中的所有文本作为一行获取,如果您只需要播放器名称,这并不是真正有用的:

anchors = soup.select("#batsmen-tests div.cb-rank-plyr a")
for a in anchors:
    print(a.text)
以漂亮的csv格式获取数据的一种快速简便的方法是仅从每个子级获取文本:

maindiv = soup.select("#batsmen-tests div.text-center")
for d in maindiv[1:]:
    row_data = u",".join(s.strip() for s in filter(None, (t.find(text=True, recursive=False) for t in d.find_all())))
    if row_data:
        print(row_data)
现在您可以得到如下输出:

# rank, up/down, name, country, rating, best rank
1,–,Steven Smith,AUSTRALIA,906,1
2,–,Joe Root,ENGLAND,878,1
3,–,Kane Williamson,NEW ZEALAND,876,1
4,–,Hashim Amla,SOUTH AFRICA,847,1
5,–,Younis Khan,PAKISTAN,845,1
6,–,Adam Voges,AUSTRALIA,802,5
7,–,AB de Villiers,SOUTH AFRICA,802,1
8,–,Ajinkya Rahane,INDIA,785,8
9,2,David Warner,AUSTRALIA,772,3
10,–,Alastair Cook,ENGLAND,770,2
11,1,Misbah-ul-Haq,PAKISTAN,764,6
与之相反:

PositionPlayerRatingBest Rank
Player
1    –Steven SmithAUSTRALIA9061
2    –Joe RootENGLAND8781
3    –Kane WilliamsonNEW ZEALAND8761
4    –Hashim AmlaSOUTH AFRICA8471
5    –Younis KhanPAKISTAN8451
6    –Adam VogesAUSTRALIA8025

你得到三次输出的原因是因为网站有三个类别,你必须选择它,然后相应地你可以使用它

使用代码执行此操作的最简单方法是只添加一行

import sys,requests,csv,io
from bs4 import BeautifulSoup

url = "http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen-   rankings"
r = requests.get(url)
r.content
soup = BeautifulSoup(r.content, "html.parser")

specific_div = soup.find_all("div", {"id": "batsmen-tests"})
maindiv = specific_div[0].find_all("div", {"class": "text-center"})
for div in maindiv:
    print(div.text) 

这将为测试击球手提供类似的重复使用,对于其他输出,只需更改特定分区行中的“id”。

获得三次输出的原因是,网站有三个类别,您必须选择它,然后才能相应地使用它

使用代码执行此操作的最简单方法是只添加一行

import sys,requests,csv,io
from bs4 import BeautifulSoup

url = "http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen-   rankings"
r = requests.get(url)
r.content
soup = BeautifulSoup(r.content, "html.parser")

specific_div = soup.find_all("div", {"id": "batsmen-tests"})
maindiv = specific_div[0].find_all("div", {"class": "text-center"})
for div in maindiv:
    print(div.text) 

这将提供类似的重用,只需测试击球手,对于其他输出,只需更改特定分区行中的“id”。

@hrmalik,不用担心,我添加了如何将数据分离成更有用的格式。我想做同样的任务,但我找不到像逗号分隔值中的数据那样做的方法,但你太棒了,你的技巧非常出色:*我想像你一样学习python技能。如果你们有任何资料可以教我,或者知道任何最好的教程,我可以从中获得学习python的最佳材料,请告诉我me@hrmalik,不用担心,我添加了如何将数据分离成更有用的格式。我想做同样的任务,但我找不到像逗号分隔值中的数据那样做的方法,但你太棒了,你的技巧非常出色:*我想像你一样学习python技能。如果你有任何源代码可以教我,或者知道任何最好的教程点,在那里我可以获得学习python的最佳材料,只要告诉我meThis就是我的代码在做什么,除了不必要地使用find_allNo,它没有,它只给出100个条目,你的给出300个结果。这就是我多写一篇文章的原因。我的答案是300。它给出了100个,并且给出了可用的格式好吧,我的不好,但是如果你看到问题不是如何使它可用,而是避免得到300个结果,只得到100个。这就是它的作用。这是我回答的第一部分,逻辑和你的完全一样,它使用id
batsmans tests
bar在表中查找,因为我提到了不必要的find\u all调用,因为我们没有查找多个表。这正是我的代码所做的,bar不必要地使用find\u all不,它只给出了100个条目,您的给出了300个结果。这就是我多写一篇文章的原因。我的答案是300。它给出了100个,并且给出了可用的格式好吧,我的不好,但是如果你看到问题不是如何使它可用,而是避免得到300个结果,只得到100个。这就是它的作用。这是我答案的第一部分,逻辑与你的完全相同,它在带有id
batsmans tests
bar的表中查找,正如我提到的,不必要的查找所有调用,因为我们没有查找多个表