Python Beautiful Soup - 未提取Span类文本

时间:2017-08-16 10:52:06

标签: python html beautifulsoup

我第一次使用美丽的汤,并且没有提取span类中的文本。我不熟悉HTML,所以我不确定为什么会这样,所以理解它会很棒。

我使用了以下代码:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.anz.com.au/personal/home-loans/your-loan/interest-rates/#varhome'

uClient = uReq(my_url)
page_html = uClient.read()
uClient.Close()
page_soup = soup(page_html, "html.parser")

content = page_soup.findAll("span",attrs={"data-item":"rate"})

使用索引0的代码,它返回以下内容:

<span class="productdata" data-baserate-code="VRI" data-cc="AU" data-
item="rate" data-section="PHL" data-subsection="VR"></span>

但是,当我通过Chrome进行检查时,我会发现类似这样的内容,因为Chrome上有利率等文字:

<span class="productdata" data-cc="AU" data-section="PHL" data-
subsection="VR" data-baserate-code="VRI" data-item="rate">5.20% p.a.</span>

2 个答案:

答案 0 :(得分:1)

您尝试提取的数据不存在。在加载页面后使用JS加载它。网站使用JSON API在页面上加载信息。如此美丽的汤无法找到数据。可以在以下链接中查看数据,该链接访问站点上的JSON API并提供JSON数据。

https://www.anz.com/productdata/productdata.asp?output=json&country=AU&section=PHL

您可以解析json并获取数据。另外,对于HTTP请求,我建议使用requests包。

答案 1 :(得分:0)

正如其他人所说,内容是JavaScript生成的,您可以selenium一起使用ChromeDriver来查找所需的数据,例如:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.anz.com.au/personal/home-loans/your-loan/interest-rates/#varhome")

items = driver.find_elements_by_css_selector("span[data-item='rate']")
itemsText = [item.get_attribute("textContent") for item in items]
>>> itemsText
['5.20% p.a.', '5.30% p.a.', '5.75% p.a.', '5.52% p.a.', ....]

如上所示,BeautifulSoup根本不是必需的,但您可以使用它来解析页面源并获得相同的结果:

from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser')
items = soup.findAll("span",{"data-item":"rate"})
itemsText = [item.text for items in items]