即使在页面上,BeautifulSoup也看不到element,

时间:2018-06-30 18:55:06

标签: python web-scraping beautifulsoup

我正在尝试从Airbnb抓取清单。每个列表都有其自己的ID。但是,以下代码的输出为None

import requests, bs4

response = requests.get('https://www.airbnb.pl/s/Girona--Hiszpania/homes?refinement_paths%5B%5D=%2Fhomes&query=Girona%2C%20Hiszpania&checkin=2018-07-04&checkout=2018-07-25&allow_override%5B%5D=&ne_lat=42.40450221314142&ne_lng=3.3245690859736214&sw_lat=41.97668610374056&sw_lng=1.7960961855829964&zoom=10&search_by_map=true&s_tag=nrGiXgWC')  
soup = bs4.BeautifulSoup(response.text, "html.parser")

element = soup.find(id="listing-18354577")
print(element)

为什么汤即使已经在页面上也看不到该元素?

是在我需要以其他方式抓取的某种类型的容器中吗?

2 个答案:

答案 0 :(得分:2)

ID为listing-18354577的元素是在初始HTML页面加载到浏览器后通过javascript创建的。 Requests只是一个HTTP客户端,而不是成熟的浏览器引擎,因此它不执行最终获取该元素的Javascript。来自Requests的响应只是页面的初始HTML(不包含listing-18354577)。

答案 1 :(得分:2)

requests不要等待js,您可以使用selenium来加载所有页面,然后使用bs4例如可以这样做:

import requests, bs4
from selenium import webdriver

# put the path to chromedriver
driver = webdriver.Chrome('path/to/chromedriver') 
website = "https://www.airbnb.pl/s/Girona--Hiszpania/homes?refinement_paths%5B%5D=%2Fhomes&query=Girona%2C%20Hiszpania&checkin=2018-07-04&checkout=2018-07-25&allow_override%5B%5D=&ne_lat=42.40450221314142&ne_lng=3.3245690859736214&sw_lat=41.97668610374056&sw_lng=1.7960961855829964&zoom=10&search_by_map=true&s_tag=nrGiXgWC"
driver.get(website) 
html = driver.page_source
soup = bs4.BeautifulSoup(html, "html.parser")

element = soup.find(id="listing-18354577")
print(element)

输出

<div class="_1wq3lj" id="listing-18354577"> ...  #and many other data