使用beautifulsoup

时间:2018-01-31 07:11:24

标签: python beautifulsoup

这是我的第一篇文章,请随时告诉我如何更好地发帖,并提前感谢您的帮助。

我正在学习如何使用BeautifulSoup从使用python的网页中抓取数据,并且很难抓住所有在使用Loungebuddy的机场。

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.loungebuddy.com/select/locations')
soup = BeautifulSoup(page.text, 'html.parser')
airport_code_html_lines = soup.find_all( attrs={'class': 'aiprt-code'})

这让我非常接近,但我有无关的数据。我想要的结果是每个结果中的第二行:

    for airport_code in airport_code_html_lines:
        print(airport_code.prettify())

我试图在这里个性化这个非常简单的案例:

https://medium.freecodecamp.org/how-to-scrape-websites-with-python-and-beautifulsoup-5946935d93fe

作者提取价格部分。但是,当我尝试做相同的

price = price_box.text

我收到此错误:

AttributeError: ResultSet object has no attribute 'txt'. You're probably 
treating a list of items like a single item. Did you call find_all() when you 
meant to call find()?
Python猜对了,我使用了查找全部...但我不知道如何继续进行。

我尝试过使用不同的打印功能,例如

print(airport_code.strip('>'))

要查看我是否可以通过创建新变量或使用创意打印命令来剥离或隔离代码,但我明白了这一点:

TypeError: 'NoneType' object is not callable

我喜欢下一步尝试的方向(考虑将find_all更改为find,然后创建for循环......但这对我来说是恐吓。希望找到更清洁的解决方案),或者工作代码将吐出我想要的结果。我希望通过这个项目和将来学习python,所以对我的思考过程的任何评论都表示赞赏。

再次感谢

2 个答案:

答案 0 :(得分:1)

只需将print(airport_code.prettify())替换为print(airport_code.text),即可获得所需的输出。

尝试以下代码(使其更清洁):

page = requests.get('https://www.loungebuddy.com/select/locations')
soup = BeautifulSoup(page.text, 'html.parser')

for country in soup.find_all('span', class_='aiprt-code'):
    print(country.text)

您也可以使用soup.find_all('span', {'class': 'aiprt-code'})代替soup.find_all('span', class_='aiprt-code')。它是一回事。

输出:

BNE
SYD
BGI
BRU
...
...

或者如果您想要列表中的国家/地区,可以使用list comprehension,如下所示。它有助于存储,使用和修改数据。

countries = [x.text for x in soup.find_all('span', class_='aiprt-code')]
print(countries)

输出:

['BNE', 'SYD', 'BGI', 'BRU', 'GIG', 'SOF', 'PNH', 'REP', ... ]

答案 1 :(得分:0)

如果您想获得机场代码及其国家/地区名称,那么您可以尝试如下:

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.loungebuddy.com/select/locations')
soup = BeautifulSoup(page.text, 'html.parser')
airport_code = {item.select_one("h2").text:item.select_one(".aiprt-code").text for item in soup.select(".country")}
print(airport_code)

部分输出:

{'India': 'BLR', 'Poland': 'KTW', 'Thailand': 'BKK', 'Croatia': 'ZAG',--so on--}