使用大熊猫来刮HTML:可以用来在网页中刮表格吗?

时间:2018-10-17 10:16:27

标签: python pandas beautifulsoup

我已经使用BeautifulSoup和urllib完成了一些基本的网络抓取。但是,我最近遇到了this链接,该链接说刮刮this这样的网页所需要做的就是运行:

import pandas as pd
tables = pd.read_html("https://apps.sandiego.gov/sdfiredispatch/")
print(tables[0])

我认为那太好了,难以置信,因为很多时候我都在与beautifulsoup和urllib2斗争。

我尝试过在this页面上拔出表:

url = "http://crdd.osdd.net/raghava/ahtpdb/display.php?details=1001"
tables = pd.read_html(url)
print tables[0]

我得到的输出是:

                              0
0  Detailed description of 1001 ID

我也在尝试其他方法,例如:

url = "http://crdd.osdd.net/raghava/ahtpdb/display.php?details=1001"
response = requests.get(url)
print response.content

或类似的东西

web_page = 'http://crdd.osdd.net/raghava/ahtpdb/display.php?details=1001'
page = urllib2.urlopen(web_page)
soup = BeautifulSoup(page, 'html.parser')
print soup.get_text()

我知道,这里通常有很多使用各种方法进行网页抓取的示例。正如您所看到的,我一直在关注这些示例,只是我似乎无法使这种方法专门针对我的问题。如果有人可以告诉我他们如何根据我的需要改进这些代码片段,我将不胜感激。

编辑1:作为一个附带说明,我在不同的网页https://dbaasp.org/peptide-card?id=3上尝试了相同的代码,但是我想这甚至更加复杂。

编辑2:根据拉菲的建议,有一些不寻常的事情。我已附上我要抓取here的网页和URL;拉菲,您可以看到我的URL与您使用的URL略有不同。然后,当我尝试在我的网址上运行您的建议时:

url = "http://crdd.osdd.net/raghava/ahtpdb/srcbr.php?details=1001"
table = pd.read_html(url)
print table[0]
print table[1]
print table[2]
print table[3]
print table[4]
print table[5]

我得到的输出是这样的(被截断):

 Browse SOURCE in AHTPDB This page gives statis...
1                            Browse SOURCE in AHTPDB
2  This page gives statistics of SOURCE fields an...
3  Following table enlists the number of entries ...
4  Following table enlists the number of entries ...
5                                               Milk
6                                                834
7  google.load("visualization", "1", {packages:["...

                                                  1   \
0                            Browse SOURCE in AHTPDB
1                                                NaN
2                                                NaN
3  Following table enlists the number of entries ...
4                                                NaN
5                                             Casein
6                                                723
7                                                NaN

                                                  2   \
0  This page gives statistics of SOURCE fields an...
1                                                NaN
2                                                NaN
3                                               Milk
4                                                NaN
5                                             Bovine
6                                                477
7                                                NaN

                                                  3   \
0  Following table enlists the number of entries ...
1                                                NaN
2                                                NaN
3                                             Casein
4                                                NaN
5                                            Cereals
6                                                419
7                                                NaN

                                                  4        5       6   \
0  Following table enlists the number of entries ...     Milk  Casein
1                                                NaN      NaN     NaN
2                                                NaN      NaN     NaN
3                                             Bovine  Cereals    Fish
4                                                NaN      NaN     NaN
5                                               Fish     Pork   Human
6                                                384      333     215
7                                                NaN      NaN     NaN

        7        8        9   \
0   Bovine  Cereals     Fish
1      NaN      NaN      NaN
2      NaN      NaN      NaN
3     Pork    Human  Chicken
4      NaN      NaN      NaN
5  Chicken  Soybean      Egg
6      177      159       97
7      NaN      NaN      NaN

                         ...                             16     17     18  \
0                        ...                          723.0  477.0  419.0
1                        ...                            NaN    NaN    NaN
2                        ...                            NaN    NaN    NaN
3                        ...                          384.0  333.0  215.0
4                        ...                            NaN    NaN    NaN
5                        ...                            NaN    NaN    NaN
6                        ...                            NaN    NaN    NaN
7                        ...                            NaN    NaN    NaN

      19     20     21     22     23    24  \
0  384.0  333.0  215.0  177.0  159.0  97.0
1    NaN    NaN    NaN    NaN    NaN   NaN
2    NaN    NaN    NaN    NaN    NaN   NaN
3  177.0  159.0   97.0    NaN    NaN   NaN
4    NaN    NaN    NaN    NaN    NaN   NaN
5    NaN    NaN    NaN    NaN    NaN   NaN
6    NaN    NaN    NaN    NaN    NaN   NaN
7    NaN    NaN    NaN    NaN    NaN   NaN

                                                  25
0  google.load("visualization", "1", {packages:["...
1                                                NaN
2                                                NaN
3                                                NaN
4                                                NaN
5                                                NaN
6                                                NaN
7                                                NaN

[8 rows x 26 columns]
                         0
0  Browse SOURCE in AHTPDB
                                                   0
0  This page gives statistics of SOURCE fields an...
                                                  0   \
0  Following table enlists the number of entries ...
1  Following table enlists the number of entries ...
2                                               Milk
3                                                834
4  google.load("visualization", "1", {packages:["...

                                                  1       2        3       4   \
0  Following table enlists the number of entries ...    Milk   Casein  Bovine
1                                                NaN     NaN      NaN     NaN
2                                             Casein  Bovine  Cereals    Fish
3                                                723     477      419     384
4                                                NaN     NaN      NaN     NaN

        5      6        7        8        9   ...      12     13     14  \
0  Cereals   Fish     Pork    Human  Chicken  ...   834.0  723.0  477.0
1      NaN    NaN      NaN      NaN      NaN  ...     NaN    NaN    NaN
2     Pork  Human  Chicken  Soybean      Egg  ...     NaN    NaN    NaN
3      333    215      177      159       97  ...     NaN    NaN    NaN
4      NaN    NaN      NaN      NaN      NaN  ...     NaN    NaN    NaN

      15     16     17     18     19     20    21
0  419.0  384.0  333.0  215.0  177.0  159.0  97.0
1    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2    NaN    NaN    NaN    NaN    NaN    NaN   NaN
3    NaN    NaN    NaN    NaN    NaN    NaN   NaN

我不知道这与我显示的屏幕截图有何相似之处?是因为'details = 1001'阻止了此方法,因为它写的不是.php页面?

编辑3:有效:

url = 'http://crdd.osdd.net/raghava/ahtpdb/display.php?details=1001'
html = urllib.urlopen(url).read()
bs = BeautifulSoup(html, 'lxml')
tab = bs.find("table",{"class":"tab"})
data = []
rows = bs.find_all('tr')
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele])

print data

1 个答案:

答案 0 :(得分:2)

您应该在桌子位置上玩一些。 例如:我以您提供的网站为例,并在其中找到一个表格(url)。 然后,我尝试了您尝试过的一段代码,但做了些微改动:


uint get_width() const;
uint get_height() const;

我得到的表很好(带有标题-以后再删除它没问题)。

这样做的原因是,在您复制的示例代码中,只有一个表(或多个表,而他们需要的表是第一个表)。这就是url = "http://crdd.osdd.net/raghava/ahtpdb/srcbr.php" tables = pd.read_html(url) print tables[4] 给他们想要的桌子的原因。就我在这里显示的情况而言,网站使用的是表格布局,而第一个表格不是您要获取的表格(在这种情况下,它是第五个表格,这就是table[0]在这种情况下可以工作的原因)

注意:您可能希望将其保存到csv中,以便于阅读:

table[4]

按照您的信息,请尝试以下操作:

url = "http://crdd.osdd.net/raghava/ahtpdb/srcbr.php"
tables = pd.read_html(url)
tables[4].to_csv("path/to/file.csv")

您将需要清理它,但是表的所有数据都应该在那里可用。