2
votes

Pourquoi y a-t-il une table quand je gratte avec beautifulSoup, mais pas des pandas

Tentative de récupération d'entrées sur ceci page dans un format délimité par des tabulations (principalement en extrayant la séquence et le numéro d'accession UniProt).

Quand je lance:

urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x1114f0898>: Failed to establish a new connection: [Errno 61] Connection refused

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.signalpeptide.de', port=443): Max retries exceeded with url: /index.php?sess=&m=listspdb_bacteria&s=details&id=2&listname= (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x1114f0898>: Failed to establish a new connection: [Errno 61] Connection refused'

ConnectionRefusedError: [Errno 61] Connection refused

J'obtiens:

from bs4 import BeautifulSoup
import requests
s = requests.session()
s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
res = s.get('https://www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=2&listname=')
print(res)

Alors j'ai essayé la belle méthode de la soupe:

import requests
import pandas as pd
import json
from pandas.io.json import json_normalize
from bs4 import BeautifulSoup

url = 'http://www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=1000&listname='
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
print(soup)

et je peux voir qu'il y a des données là-bas. Quelqu'un a-t-il une idée de pourquoi je ne peux pas analyser cette page avec pandas.read_html? Edit 1: Sur la base de la suggestion ci-dessous, j'ai exécuté ceci:

Traceback (most recent call last):
  File "scrape_signalpeptides.py", line 7, in <module>
    table = pd.read_html(url)
  File "/Users/ION/anaconda3/lib/python3.7/site-packages/pandas/io/html.py", line 1094, in read_html
    displayed_only=displayed_only)
  File "/Users/ION/anaconda3/lib/python3.7/site-packages/pandas/io/html.py", line 916, in _parse
    raise_with_traceback(retained)
  File "/Users/ION/anaconda3/lib/python3.7/site-packages/pandas/compat/__init__.py", line 420, in raise_with_traceback
    raise exc.with_traceback(traceback)
ValueError: No tables found

.... J'ai changé l'URL en tout www, http et https; et pour tout ce que je reçois des erreurs liées à des erreurs de connexion, par exemple

url = 'www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=1000&listname='    
table = pd.read_html(url)
print(table)


1 commentaires

Je ne parviens pas à reproduire ce problème. pd.read_html ('http://www.signalpeptide.de/index.php?sess=&m=‌ listspdb_bacteria & s = ‌ details & id = 1000 & list‌ name =') renvoie une liste de 2 dataframes , de formes [(42, 103), (20, 5)]


3 Réponses :


1
votes

La variable url est différente entre vos scripts.

Côte à côte pour comparaison:

C:\Users\rparkhurst\PycharmProjects\Workspace\venv\Scripts\python.exe C:/Users/rparkhurst/PycharmProjects/Workspace/new_workspace.py
<!doctype html>
<html class="no-js" lang="en">
<head>
 <meta charset="utf-8"/>
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <title>Signal Peptide Database</title>
 <link rel="stylesheet" href="css/foundation.css">
 <link href='http://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.css' rel='stylesheet' type='text/css'>
 <link href="css/custom.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="top-bar">
 <div class="row">
  <div class="top-bar-left">
   <div class="top-bar-title">
    <span data-responsive-toggle="responsive-menu" data-hide-for="medium">
     <span class="menu-icon dark" data-toggle></span>
    </span>
    <a href="./"><img src="img/logo.jpg" alt="logo" id="logo"></a>
   </div>
  </div>
 <div class="top-bar-right">
  <h3 class="hide-for-small">Signal Peptide Website</h3>
  <div id="responsive-menu">
   <ul class="dropdown menu" data-dropdown-menu>
    <li><a href="./?m=myprotein">Search my Protein</a></li>
    <li><a href="./?m=searchspdb">Advanced Search</a></li>
    <li><a href="./?m=listspdb">Database Search</a></li>
    <li><a href="./?m=references">References</a></li>
    <li><a href="./?m=hints">Hints</a></li>
    <li><a href="./?m=links">Links</a></li>
    <li><a href="./?m=imprint">Imprint</a></li>
    </ul>
   </div>
  </div>
 </div>
</div>
<br>
<div class="row columns">
<div class="content">
<span class="headline">Signal Peptide Database - Bacteria</span><br><br>
<form action="index.php" method="post"><input type="hidden" name="sess" value="">
<input type="hidden" name="m" value="listspdb_bacteria">
<input type="hidden" name="id" value="2">
<input type="hidden" name="a" value="save">
<table cellspacing="2" cellpadding="2" border="0">
<tr>
<td colspan="3" class="tabhead">&nbsp;<b>Entry Details</b></td></tr>
<tr height="23">
<td class="highlight">ID</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">2</td>
</tr>
<tr height="23">
<td class="highlight">Source Database</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">UniProtKB/Swiss-Prot</td>
</tr>
<tr height="23">
<td class="highlight">UniProtKB/Swiss-Prot Accession Number</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">A6X5T5&nbsp;&nbsp;&nbsp;&nbsp;(Created: 2009-01-20 Updated: 2009-01-20)</td>
</tr>
<tr height="23">
<td class="highlight">UniProtKB/Swiss-Prot Entry Name</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight"><a target="_new" class="bblack" href="http://www.uniprot.org/uniprot/14KL_OCHA4">14KL_OCHA4</a></td>
</tr>
<tr height="23">
<td class="highlight">Protein Name</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">Lectin-like protein BA14k</td>
</tr>
<tr height="23">
<td class="highlight">Gene</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">Oant_3884</td>
</tr>
<tr height="23">
<td class="highlight">Organism Scientific</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">Ochrobactrum anthropi (strain ATCC 49188 / DSM 6882 / NCTC 12168)</td>
</tr>
<tr height="23">
<td class="highlight">Organism Common</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight"></td>
</tr>
<tr height="23">
<td class="highlight">Lineage</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">Bacteria<br>&nbsp;&nbsp;Proteobacteria<br>&nbsp;&nbsp;&nbsp;&nbsp;Alphaproteobacteria<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rhizobiales<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Brucellaceae<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ochrobactrum<br></td>
</tr>
<tr height="23">
<td class="highlight">Protein Length [aa]</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">151</td>
</tr>
<tr height="23">
<td class="highlight">Protein Mass [Da]</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">17666</td>
</tr>
<tr height="23">
<td class="highlight">Features</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight"><table><tr><td><b>Type</b></td><td><b>Description</b></td><td><b>Status</b></td><td><b>Start</b></td><td><b>End</b></td></tr><tr><td class="w"><font color="red">signal peptide</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="red"></font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="red">potential</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="red">1</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="red">26</font></td></tr><tr><td class="w"><font color="blue">chain</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="blue">Lectin-like protein BA14k</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="blue"></font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="blue">27</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="blue">151</font></td></tr><tr><td class="w"><font color="green">transmembrane region</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="green"></font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="green">potential</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="green">83</font>&nbsp;&nbsp;&nbsp;</td><td class="w"><font color="green">103</font></td></tr></table></td>
</tr>
<tr height="23">
<td class="highlight">SP Length</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight">26</td>
</tr>
<tr valign="top">
<td class="highlight"></td><td class="highlight" width="50">&nbsp;</td><td class="highlightfixed">----+----1----+----2----+----3----+----4----+----5</td></tr><tr valign="top">
<td class="highlight">Signal Peptide</td><td class="highlight" width="50">&nbsp;</td><td class="highlightfixed">MNIFKQTCVGAFAVIFGATSIAPTMA</td></tr><tr valign="top">
<td class="highlight">
Sequence</td><td class="highlight" width="50">&nbsp;</td><td class="highlightfixed"><font color="red">MNIFKQTCVGAFAVIFGATSIAPTMA</font><font color="blue">APLNLERPVINHNVEQVRDHRRPP<br>RHYNGHRPHRPGYWNGHRGYRHYRHGYRRYND</font><font color="green">GWWYPLAAFGAGAIIGGA<br>VSQ</font><font color="blue">PRPVYRAPRMSNAHVQWCYNRYKSYRSSDNTFQPYNGPRRQCYSPYS<br>R</td></tr><tr valign="top">
<td class="highlight">
Original</td><td class="highlight" width="50">&nbsp;</td><td class="highlightfixed">MNIFKQTCVGAFAVIFGATSIAPTMAAPLNLERPVINHNVEQVRDHRRPP<br>RHYNGHRPHRPGYWNGHRGYRHYRHGYRRYNDGWWYPLAAFGAGAIIGGA<br>VSQPRPVYRAPRMSNAHVQWCYNRYKSYRSSDNTFQPYNGPRRQCYSPYS<br>R</td></tr><tr valign="top">
<td class="highlight"></td><td class="highlight" width="50">&nbsp;</td><td class="highlightfixed">----+----1----+----2----+----3----+----4----+----5</td></tr><tr height="23">
<td class="highlight">Hydropathies</td>
<td class="highlight" width="50">&nbsp;</td>
<td class="highlight"><a href="./hydropathy/hydropathy.php?id=2" target="_new"><img src="./hydropathy/hydropathy.php?id=2" border="0" width="600"></a></td>
</tr>
<tr>
<td colspan="3" class="nohighlight">&nbsp;</td>
</tr>
<tr>
<td colspan="3" class="tabhead" align="center"><input class="button" type="reset" value="Back" onclick="history.back(-1);"></td>
</tr>
</table>
</form></div>
<hr>
<div class="row">
 <div class="small-4 medium-3 columns"><a href="./">Home</a>&nbsp;&nbsp;&nbsp;<a href="./?m=imprint">Imprint</a></div>
 <div class="small-8 medium-9 columns text-right">
 &copy; 2007-2017 <a href="mailto:kapp@mpi-cbg.de">Katja Kapp</a>, Dresden &amp; <a href="http://www.thpr.net/">thpr.net e. K.</a>, Dresden, Germany, last update 2010-06-11
 </div>
</div><br><br>
<script src="js/vendor/jquery.js"></script>
<script src="js/foundation.js"></script>
<script>
 $(document).foundation();
</script>
</body>
</html>


Process finished with exit code 0

Je soupçonne que le Le bit http: // est important pour que les pandas le reconnaissent comme une URL par opposition au HTML lui-même. Après tout, pandas.read_html interprète l'argument de manière dynamique comme décrit dans la documentation

Une URL, un objet semblable à un fichier ou une chaîne brute contenant du HTML. Notez que lxml n'accepte que les protocoles http, ftp et file url. Si votre URL commence par "https", vous pouvez essayer de supprimer le "s".

Où spécifiquement la partie Si vous avez une URL qui commence par "https", vous pouvez essayer de supprimer le "s" me laisse croire que le http: // est important pour qu'il sache qu'il s'agit d'un lien par opposition à un "objet de type fichier" ou du HTML brut.

Si l'erreur dépasse le nombre maximal de tentatives, vous devez probablement implémenter un requests.session avec en-têtes. Un code précédent que j'ai fait avec ceci ressemblait à:

from bs4 import BeautifulSoup
import requests
s = requests.session()
s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
res = s.get('http://www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=2&listname=')
print(res.text)

À quel point vous devriez être capable d'interpréter l'objet res de la même manière que vous serait un objet requests.get () normal (vous pouvez appeler des méthodes comme .text et autres). Je ne sais pas trop comment fonctionnent les s.headers , c'est juste à partir d'un autre article SO que j'ai copié et corrigé mon script!

mise à jour

Une partie du message d'erreur de votre dernier bloc de code est

ssl.CertificateError: le nom d'hôte 'www.signalpeptide.de' ne correspond ni à 'www.kg13.art', 'www.thpr.net'

Ce qui signifie que leur certificat SSL n'est pas valide et que https ne fonctionnera probablement pas car l'hôte ne peut pas être vérifié. Je l'ai ajusté à http et pour afficher le HTML résultant:

import requests

s = requests.session()
s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'

res = s.get('your_url')

Résultats dans:

url = 'www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=1000&listname=' # pandas
url = 'http://www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=1000&listname=' # BeautifulSoup

Il semble donc que cela résout vos problèmes.


6 commentaires

Merci, désolé, je déconnais avec www, http et https pour les deux méthodes pour voir si cela ferait une différence, mais la méthode pandas ne fonctionnait avec aucun de ces préfixes.


c'était étrange que d'autres ne puissent pas reproduire mon erreur, et je ne pouvais pas faire fonctionner les autres solutions.Je me suis dérangé, j'ai obtenu ceci: requests.exceptions.ConnectionError: HTTPConnectionPool (host = 'www.signalpeptide.de', port = 80): Nombre maximal de tentatives dépassé avec url: /index.php?sess=&m=listspdb_bacteria&s=details&id=1&listname‌ = (Causé par NewConnectionError (': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée ')) J'ai cherché des solutions, installé pyopenssl; et ajouté «verify = False» à l'une de mes tentatives.


Donc, je suppose que l'erreur est que j'atteins le nombre maximum de tentatives pour visiter une URL sur la page?


@Kela Si c'est l'erreur, j'ai posté un moyen de la corriger!


Merci beaucoup pour votre suggestion, j'ai modifié ma question pour afficher le code exact que j'ai exécuté en fonction de la suggestion au cas où j'aurais mal compris, mais lorsque j'essaye le code que j'ai publié en tant que modification, avec l'un des www, http , https; Je reçois une connexion refusée. Merci de votre aide.


@Kela Je ne sais pas ce que vous entendez par "essayé avec http", car cela fonctionne pour moi comme indiqué dans mon message. Si vous avez toujours une erreur, c'est probablement à partir de vos paramètres Internet, et je vous implore de faire un article séparé si vous ne pouvez pas le résoudre! Chaque message doit être une question / réponse et ce va-et-vient s'éloigne rapidement de Pourquoi y a-t-il une table quand je gratte avec beautifulSoup, mais pas des pandas parce que vous décrivez une requêtes problème maintenant.



1
votes

Essayez ceci:

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd

url = 'http://www.signalpeptide.de/index.php?sess=&m=listspdb_bacteria&s=details&id=1000&listname='    
r = requests.get(url)

tabs = soup.find_all('table')
my_tab = pd.read_html(str(tabs[0]))
my_tab[0].drop(my_tab[0].columns[1], axis=1).drop(my_tab[0].index[0])

Cela devrait afficher le tableau principal sur la page commençant par «id 1000».


0 commentaires

0
votes

Si vous trouvez une table dans soupe mais pas lors de l'analyse en utilisant read_html, la raison peut être que la table spécifique est masquée. Vous pouvez donc utiliser le composant logiciel enfichable ci-dessous:

import bs4
import pandas

# open file available at file_path
with open(file_path, encoding='utf-8') as fobj:
    soup = bs4.BeautifulSoup(fobj, 'html5lib')

# provide your table's class_name
tables = soup.find_all('table', attrs={'class': 'class_name'})


for table in tables:
    filtered_lines = list()
    data_frame = pandas.read_html(str(table), displayed_only=False)

Remarque: l'option display_only dans read_html vous permettra également d'analyser les tables cachées.


0 commentaires