Использование панд для очистки HTML: можно ли использовать его для очистки таблицы на веб-странице? - PullRequest
0 голосов
/ 17 октября 2018

Я сделал несколько базовых операций с использованием BeautifulSoup и urllib.Однако недавно я наткнулся на эту ссылку, в которой говорилось, что все, что вам нужно сделать, чтобы очистить веб-страницу, например эту , нужно запустить:

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

Я думалэто слишком хорошо, чтобы быть правдой, так как я часто борюсь с Beautifulsoup и urllib2.

Я пытался вытащить таблицу на этой странице:

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: Есть нечто необычное, основанное на предложении Рафи.Я приложил веб-страницу и URL, который я пытаюсь очистить here;Рафи, вы можете видеть, что мой 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 голосов
/ 17 октября 2018

Вы должны немного поиграться с расположением стола.Например: я взял веб-сайт, который вы дали в качестве примера, и нашел там таблицу ( url ).Затем я попробовал фрагмент кода, который вы пробовали, но с небольшим изменением:

url = "http://crdd.osdd.net/raghava/ahtpdb/srcbr.php"
tables = pd.read_html(url)
print tables[4]

, и я получил таблицу очень хорошо (с заголовком - без проблем, чтобы удалить его позже).

Причина этого в том, что в примере кода, который вы скопировали, была только одна таблица (или более одной, и таблица, в которой они нуждались, была первой).Вот почему table[0] дал им стол, который они хотели.В случае, который я показал здесь, веб-сайт использует таблицы для разметки, и первая таблица не является таблицей, которую вы пытаетесь получить (в данном случае это пятая таблица - именно поэтому table[4] будет работать в этом случае)

Примечание: вы можете сохранить его в формате CSV, чтобы его было легче читать:

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

Следуя вашей информации, попробуйте это:

from bs4 import BeautifulSoup
import urllib.request

url = 'http://crdd.osdd.net/raghava/ahtpdb/display.php?details=1001'
html = urllib.request.urlopen(url).read()
bs = BeautifulSoup(html)
tab = bs.find("table",{"class":"tab"})
print(tab)

Вам нужно будет его почистить, но там должны быть доступны все данные таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...