使用 selenium 抓取网页时缺少 HTML 内容
Missing HTML content when using selenium to scrape webpage
我正在尝试从网站上抓取产品的降价信息。
检查网站时 HTML 看起来像这样:
我的代码如下所示:
browser = webdriver.Chrome(executable_path='/chromedriver.exe')
browser.get('https://www.mydays.de/magicbox/kurzurlaub')
soup = BeautifulSoup(browser.page_source, 'html.parser')
Price = soup.find('div',{"class":"c-mbvoucher__pricebox"})
但是我的结果是这样的:
<div class="c-mbvoucher__pricebox">
<span class="c-mbvoucher__price">159 €</span>
<span class="c-mbvoucher__person">
für 2 Personen </span>
</div>
为什么我的结果中缺少一些信息?
我也试过find_all,不过只有上面一个符合。
要提取文本 159 €,您可以使用以下任一方法 :
使用css_selector
:
print(driver.find_element_by_css_selector("div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))
使用xpath
:
print(driver.find_element_by_xpath("//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))
理想情况下,要找到需要为 visibility_of_element_located()
引入 WebDriverWait 的元素,您可以使用以下任一方法 :
使用CSS_SELECTOR
:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))).get_attribute("innerHTML"))
使用XPATH
:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))).text)
控制台输出:
159 €
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
更新
如果您的用例是提取文本 119,25 € 因为文本在 文本节点中您可以使用以下任一解决方案:
使用CSS_SELECTOR
:
print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox")))).strip())
使用XPATH
:
print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']")))).strip())
控制台输出:
119,25 €
我正在尝试从网站上抓取产品的降价信息。
检查网站时 HTML 看起来像这样:
我的代码如下所示:
browser = webdriver.Chrome(executable_path='/chromedriver.exe')
browser.get('https://www.mydays.de/magicbox/kurzurlaub')
soup = BeautifulSoup(browser.page_source, 'html.parser')
Price = soup.find('div',{"class":"c-mbvoucher__pricebox"})
但是我的结果是这样的:
<div class="c-mbvoucher__pricebox">
<span class="c-mbvoucher__price">159 €</span>
<span class="c-mbvoucher__person">
für 2 Personen </span>
</div>
为什么我的结果中缺少一些信息?
我也试过find_all,不过只有上面一个符合。
要提取文本 159 €,您可以使用以下任一方法
使用
css_selector
:print(driver.find_element_by_css_selector("div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))
使用
xpath
:print(driver.find_element_by_xpath("//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))
理想情况下,要找到需要为 visibility_of_element_located()
引入 WebDriverWait 的元素,您可以使用以下任一方法
使用
CSS_SELECTOR
:print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))).get_attribute("innerHTML"))
使用
XPATH
:print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))).text)
控制台输出:
159 €
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
更新
如果您的用例是提取文本 119,25 € 因为文本在 文本节点中您可以使用以下任一解决方案:
使用
CSS_SELECTOR
:print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox")))).strip())
使用
XPATH
:print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']")))).strip())
控制台输出:
119,25 €