Python-使用BeautifulSoup在页面内抓取多个类

加里

我正在尝试获取Agoda多种房型的每日酒店价格以及其他信息,例如促销信息,早餐条件和现在预订后付款的规定。

我的代码如下:

import requests
import math
from bs4 import BeautifulSoup

url = "http://www.agoda.com/ambassador-hotel-taipei/hotel/taipei-tw.html?asq=8m91A1C3D%252bTr%252bvRSmuClW5dm5vJXWO5dlQmHx%252fdU9qxilNob5hJg0b218wml6rCgncYsXBK0nWktmYtQJCEMu0P07Y3BjaTYhdrZvavpUnmfy3moWn%252bv8f2Lfx7HovrV95j6mrlCfGou99kE%252bA0aX0aof09AStNs69qUxvAVo53D4ZTrmAxm3bVkqZJr62cU&tyra=1%257c2&searchrequestid=2e2b0e8c-cadb-465b-8dea-2222e24a1678&pingnumber=1&checkin=2015-10-01&los=1"
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
n = len(soup.select('.room-name'))

for i in range(0, n):
    en_room = soup.select('.room-name')[i].text.strip()
    currency = soup.select('.currency')[i].text
    price = soup.select('.sellprice')[i].text

    try:
        sp_info = soup.select('.left-room-info')[i].text.strip()
    except Exception as e:
        sp_info = "N/A"

    try:
        pay_later = soup.select('.book-now-paylater')[i].text.strip()
    except Exception as e:
        pay_later = "N/A"


    print en_room, i+1, currency, price, en_room, sp_info, pay_later
    time.sleep(1)

我有两个问题:

(1)“ left-room-info”类似乎包含两个子类“ breakfast”和“ room-promo”。这些子类仅在特定房间类型提供此类服务时显示。

当仅显示一个子类时,输出效果很好。但是,当没有子类出现时,当我期望显示“ N / A”时,输出为空。同样,当两个子类都出现时,输出格式将包含不必要的空行,这些空行无法通过.strip()删除。

有什么办法可以解决这些问题?

(2)当我尝试从“ .book-now-paylater”类中提取信息时,提取的数据与每种房间类型都不匹配。例如,假设有10种房型,只有2号,4号,6号,8号房允许旅行者稍后预订,那么代码可以准确地提取4条“以后预订的信息”,但是这4条信息是然后不适当地分配了房间类型1、2、3、4。

有什么办法可以解决这个问题?

感谢您的帮助!

加里

热心

(1)之所以会这样,是因为即使'.left-room-info'选择中没有文本,它也不会引发异常,并且您except将永远不会运行。您应该检查该值是否为空字符串('')。你可以用这样的简单的方法做到这if not string_var一点

sp_info = soup.select('.left-room-info')[i].text.strip()
if not sp_info:
    sp_info = "N/A"

当两个子类都出现时,您应该在回车符('\r'上分割字符串,然后剥离每个得到的片段。代码看起来像这样:(请注意,现在sp_info是一个列表,而不仅仅是一个字符串)

sp_info = soup.select('.left-room-info')[i].text.strip().split('\r')
if len(sp_info) > 1:
    sp_info = [ info.strip() for info in sp_info ]

将这些片段放在一起,我们将得到类似的内容

sp_info = soup.select('.left-room-info')[i].text.strip().split('\r')
if len(sp_info) > 1:
    sp_info = [ info.strip() for info in sp_info ]
elif not sp_info[0]: # check for empty string
    sp_info = ["N/A"] # keep sp_info a list for consistancy 

(2)有点复杂。您将不得不更改解析页面的方式。即,您可能必须选择on .room-type您选择书籍的方式现在需要以后支付,它不会将它们与任何其他元素相关联,而只是选择该类的8个实例。这是我要做的事情:

import requests
import math
from bs4 import BeautifulSoup

url = "http://www.agoda.com/ambassador-hotel-taipei/hotel/taipei-tw.html?asq=8m91A1C3D%252bTr%252bvRSmuClW5dm5vJXWO5dlQmHx%252fdU9qxilNob5hJg0b218wml6rCgncYsXBK0nWktmYtQJCEMu0P07Y3BjaTYhdrZvavpUnmfy3moWn%252bv8f2Lfx7HovrV95j6mrlCfGou99kE%252bA0aX0aof09AStNs69qUxvAVo53D4ZTrmAxm3bVkqZJr62cU&tyra=1%257c2&searchrequestid=2e2b0e8c-cadb-465b-8dea-2222e24a1678&pingnumber=1&checkin=2015-10-01&los=1"
res = requests.get(url)
soup = BeautifulSoup(res.text)

rooms = soup.select('.room-type')[1:] # the first instance of the class isn't a room

room_list = []

for room in rooms:
    room_info = {}

    room_info['en_room'] = room.select('.room-name')[0].text.strip()
    room_info['currency'] = room.select('.currency')[0].text.strip()
    room_info['price'] = room.select('.sellprice')[0].text.strip()

    sp_info = room.select('.left-room-info')[0].text.strip().split('\r')
    if len(sp_info) > 1:
        sp_info = ", ".join([ info.strip() for info in sp_info ])
    elif not sp_info[0]: # check for empty string
        sp_info = "N/A"
    room_info['sp_info'] = sp_info

    pay_later = room.select('.book-now-paylater')
    room_info['pay_later'] = pay_later[0].text.strip() if pay_later else "N/A"

    room_list.append(room_info)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 BeautifulSoup 在 python 中抓取多个页面

如何使用Python和BeautifulSoup抓取多个Google页面

使用 BeautifulSoup 和 Python 抓取多个表格页面

如何使用BeautifulSoup和Python抓取页面?

如何使用python和beautifulsoup4循环抓取网站中多个页面的数据

使用python为多个页面抓取网页

python beautifulsoup抓取存档页面

如何在一个Web上从多个页面抓取数据,我正在使用Python和BeautifulSoup

如何使用python BeautifulSoup通过分页抓取页面

使用BeautifulSoup和Python刮取多个页面

网页抓取 - 从使用 BeautifulSoup 和 Python 的类中获取文本?

使用Python无法使用不变的网址抓取多个页面

Python Web抓取多个页面

使用BeautifulSoup + Python在href内抓取超链接

如何使用不变的网址抓取多个页面-Python 3

如何使用Selenium(Python)网页抓取多个页面

使用python进行网页抓取分页时迭代多个页面

使用BeautifulSoup Python抓取网页

使用 python 抓取网站 - BeautifulSoup

在python和beautifulsoup中查找同一个<div>内的多个抓取数据

使用 Python 抓取特定页面

使用python selenium / Beautifulsoup从多个页面提取数据

通过网页抓取python加载多个页面

用python抓取多个部分的页面

抓取多个页面标题的Python问题

使用beautifulsoup python从页面中抓取特定元素时遇到问题

Web使用BeautifulSoup抓取多个页面

使用 BeautifulSoup 在 Steam 中抓取多个页面

使用 Python 和 BeautifulSoup 提取数字(多个跨度和类)