我第一次使用美丽的汤,并且没有提取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>
答案 0 :(得分:1)
您尝试提取的数据不存在。在加载页面后使用JS加载它。网站使用JSON API在页面上加载信息。如此美丽的汤无法找到数据。可以在以下链接中查看数据,该链接访问站点上的JSON API并提供JSON数据。
https://www.anz.com/productdata/productdata.asp?output=json&country=AU§ion=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]