Salut, je lis "Web Scraping with Python (2015)". J'ai vu les deux façons suivantes d'ouvrir l'URL, avec et sans utiliser .read(). Voir bs1 et bs2

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen('http://web.stanford.edu/~zlotnick/TextAsData/Web_Scraping_with_Beautiful_Soup.html')
bs1 = BeautifulSoup(html.read(), 'html.parser')

html = urlopen('http://web.stanford.edu/~zlotnick/TextAsData/Web_Scraping_with_Beautiful_Soup.html')
bs2 = BeautifulSoup(html, 'html.parser')

bs1 == bs2 # true


print(bs1.prettify()[0:100])
print(bs2.prettify()[0:100]) # prints same thing

Donc, .read() est-il redondant? Merci

Code sur p7 du Web scraping avec python: (utilisez .read())

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read())

Code sur p15 (sans .read())

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
bsObj = BeautifulSoup(html)
5
YJZ 8 mars 2016 à 12:30

3 réponses

Meilleure réponse

Pour citer BS BS:

Pour analyser un document, passez-le dans le constructeur BeautifulSoup. Vous pouvez passer une chaîne ou un descripteur de fichier ouvert:

Lorsque vous utilisez la méthode .read (), vous utilisez une interface "chaîne". Lorsque vous ne l'êtes pas, vous utilisez l'interface "filehandle".

En fait, cela fonctionne de la même manière (bien que BS4 puisse lire un objet de type fichier de manière paresseuse). Dans votre cas, le contenu entier est lu dans un objet chaîne (il peut consommer plus de mémoire inutilement).

4
Łukasz Rogalski 8 mars 2016 à 09:38

Sans module BeautifulSoup

.read () est utile lorsque vous n'utilisez pas le module "BeautifulSoup", ce qui le rend non redondant dans ce cas. Ce n'est que si vous utilisez .read () que vous obtiendrez le contenu html, sans lequel vous aurez juste l'objet retourné par .urlopen ()

Avec le module BeautifulSoup

Le module BS a 2 constructeurs pour cette fonctionnalité, l'un acceptera String et l'autre acceptera l'objet retourné par .urlopen ( some-site )

2
Rohit Gadia 8 mars 2016 à 09:45

urllib.request.urlopen renvoie un fichier- comme objet, sa méthode read renverra le corps de réponse de cette URL.

Le constructeur BeautifulSoup accepte à la fois une chaîne ou un descripteur de fichier ouvert, donc oui, read() est redondant ici.

4
wong2 8 mars 2016 à 09:38