【发布时间】:2018-11-25 15:57:35
【问题描述】:
我正处于创建网络抓取工具的初级阶段。我对 Python 还是很陌生。我正在尝试从网页中提取星级。这意味着在页面中查找所有 img alt 文本的列表并将其打印到控制台。
url = 'https://www.nhtsa.gov/vehicle/2017/FORD/ESCAPE/SUV/AWD#safety-ratings-frontal' #url to retrieve data from
html = '<div class="col-sm-6"><img src="/sites/nhtsa.dot.gov/themes/nhtsa_gov/images/star-rating/5.png" alt="5 star" class="vehicle-base-details--rating"></div>' #temporary-- for testing
page = urlopen(url)
soup = BeautifulSoup(page, "html.parser")
for div in soup.find_all('div'): #lists all image alt text
for img in div.find_all('img', alt=True):
print(img['alt'])
当我在第 4 行将“page”替换为“html”时,BeautifulSoup 能够提取我需要的内容并打印“5 星”。问题是当我尝试直接从网页获取 HTML 时。我也尝试过按对象的类进行搜索,但当我直接从网站获取它时,我最终得到一个空列表。
【问题讨论】:
-
您是否检查过您的
for img in...循环是否确实找到了任何东西? -
是的,它会打印一个图像替代文本列表,但 5 星不在该列表中。
-
好的...当您查看页面源代码时,您会发现它不在页面 DOM 中。它来自 XHR 请求,然后 javascript 将其添加到页面...如果您打开浏览器的开发工具,您会看到评分来自:api.nhtsa.gov/vehicles/… 所以我想您想从中加载 json 数据代替?
-
就是这样,我没有意识到有可用的 API。谢谢!
-
看不到 5 星的原因是动态加载,API 将是最适合您的方式。
标签: python beautifulsoup