im是一个Python新手,并尝试编写一个web scraper脚本来获取一些价格数据。例如,我试图抓取的网站是:https://www.medizinfuchs.de/?params%5Bsearch%5D=10192710¶ms%5Search_cat%5D=1
我正在使用以下代码:
from bs4 import BeautifulSoup
import requests
URL = "https://www.medizinfuchs.de/?params%5Bsearch%5D=11484834¶ms%5Bsearch_cat%5D=1"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
for price in soup.select('li.apotheke div.price'):
print(float(price.text.strip(' tn€').replace(',', '.')))
for name in soup.select('li.apotheke a.name'):
print(str(name.text.strip(' tn€')))
我第一次运行它时,它就像一个符咒,但之后我就没有输出了。。。
我期望的输出:
5.395.45.45.655.85.895.895.94 Apotheke Prime Apoversand24.de bon-vita.de 1-apo.de eurapon.de docmorris.de sternapo ahorn24.de
你能帮我让它持续工作吗?
感谢
会发生什么
看看你的汤-它告诉了真相。在soup
中没有类为apotheke
的<li>
,因此您不会得到任何结果。
如何修复
选择正确的标签或跳过它们,专注于classes
(这不是最好的主意,因为类经常更改,但在这种情况下,你能做的最好(
for e in soup.select('.apotheke'):
print(e.select_one('.price').get_text(strip=True).split(' ')[0])
for e in soup.select('.apotheke'):
print(e.select_one('.name').get_text(strip=True))
示例(更结构化(
data=[]
for e in soup.select('.apotheke'):
data.append({
'name':e.select_one('.name').get_text(strip=True),
'price':e.select_one('.price').get_text(strip=True).split(' ')[0]
})
data
输出
[{'name': 'ApothekePrime', 'price': '5,39'},
{'name': 'Apoversand24.de', 'price': '5,40'},
{'name': 'bon-vita.de', 'price': '5,40'},
{'name': '1-apo.de', 'price': '5,65'},
{'name': 'eurapon.de', 'price': '5,80'},
{'name': 'docmorris.de', 'price': '5,89'},
{'name': 'sternapo', 'price': '5,89'},
{'name': 'ahorn24.de', 'price': '5,94'}]