【问题标题】:BeautifulSoup not extracting image alt textBeautifulSoup 不提取图像替代文本
【发布时间】: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


【解决方案1】:
from bs4 import BeautifulSoup
import requests

s = requests.Session()
url = 'https://www.nhtsa.gov/vehicle/2017/FORD/ESCAPE/SUV/AWD#safety-ratings-frontal' #url to retrieve data from
page = s.get(url).text

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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 2020-07-25
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多