使用beautifulsoup从标签中刮取文本

时间:2017-10-03 15:02:07

标签: python web-scraping beautifulsoup

我正在为一个项目工作,我想抓一些信息从许多网站建立一个数据库。 我学到了一点Python以及如何使用BeautifulSoup库并尝试了下面的内容。

import urllib.request
from bs4 import BeautifulSoup as BS

html = urllib.request.urlopen('http://paris.quel-institut-beaute.com/').read()

soup = BS(html, 'lxml')

soup = soup.find_all("div", class_="ic")
print (soup)

当我尝试仅使用属性的文本时,它告诉我这是不可能的。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用requests library来简化您的代码,它比urllib更高级别。您还可以使用CSS选择器从页面源中提取标签,它们更清晰,使用起来更加健壮。 BeautifulSoup docs contain plenty of useful into on them.

import requests
from bs4 import BeautifulSoup

response = requests.get('http://paris.quel-institut-beaute.com')
soup = BeautifulSoup(response.content, 'lxml')

# soup.select() will return a list of all tags with class 'ic'
stores = soup.select('.ic')

如果您尝试在列表中拨打get_text()text,则无效。相反,您需要迭代列表中的元素以从中获取文本。

for tag in stores:
    print(tag.get_text(strip=True))

如果您要从同一个脚本use a Session object from the Requests library发出多个请求。它将使用相同的TCP连接,从而提高性能。

这超出了问题的范围,但是如果要序列化商店信息,可以这样做:

import json
from collections import OrderedDict

import requests
from bs4 import BeautifulSoup

response = requests.get('http://paris.quel-institut-beaute.com')
soup = BeautifulSoup(response.content, 'lxml')
stores = soup.select('.ic')

store_details = OrderedDict()
for store in stores:
    store_name = store.select_one('h3').get_text()
    store_address = store.select_one('.street-address').get_text()
    postal_code = store.select_one('.postal-code').get_text()
    locality = store.select_one('.locality').get_text()

    store_details[store_name] = {
        'store_address': store_address,
        'postal_code': postal_code,
        'locality': locality
    }

shop_details_json = json.dumps(store_details, indent=4, separators=(',', ':'))

您可以打印shop_details_json以查看以一系列词典形式存储的信息,使用商店名称作为键,地址作为值。

答案 1 :(得分:0)

您正在获取迭代器,因此您需要在for循环中显示每个迭代器:

import requests
from bs4 import BeautifulSoup

response = requests.get('http://paris.quel-institut-beaute.com')
soup = BeautifulSoup(response.content, 'lxml')

for div in soup.find_all("div", class_="ic"):
    print(div.get_text(strip=True))

给你:

En savoir plusDelicates Attentions425 avis8 Passage Du Guesclin75015Paris
En savoir plusInstitut Du Regard53 avis30 Rue de Lagny75020Paris
En savoir plusEtoile Nails420 avis27 Av. Ledru Rollin75012Paris
En savoir plusInstitut Marie Pauline485 avis9 Boulevard Arago75013Paris
En savoir plusInstitut Pyrene524 avis2 Rue Greffulhe75008Paris
En savoir plusNymphee12 avis28 Rue Glaciere75013Paris
En savoir plusGrain De Beaute430 avis1 Rue Petion75011Paris
En savoir plusOumy Esthetique23 avis1 Rue Tanneries75013Paris
En savoir plusEric Nicolas Louis11 avis50 Boulevard Arago75013Paris
En savoir plusBiozen519 avis26 Boulevard de Magenta75010Paris
En savoir plusBulle De Soins411 avis149 Rue Raymond Losserand75014Paris
En savoir plusCryominceur0aucun avis19 Rue Nicolo75116Paris
En savoir plusAU TEMPS D'UN SOIN57 avis55 rue de Turbigo75003Paris
En savoir plusLe Boudoir Parisien41 avis251, avenue Daumesnil75012Paris
En savoir plusAlex'sthetik0aucun avis49, rue St Placide75006Paris