【问题标题】:How to extract text from svg using python selenium如何使用 python selenium 从 svg 中提取文本
【发布时间】:2020-09-24 10:45:33
【问题描述】:

我正在尝试从链接中获取价格:https://www.kbb.com/cadillac/deville/1996/sedan-4d/

价格显示在 svg 标签内的 text 标签中。

当我使用 xpath 时: .//*[name()='svg']//*[name()='g']//*[name()='text'] 在浏览器的检查元素中,我能够找到标签。但是相同的 xpath 在代码中不起作用。

目前的代码是:

def get_price(url):
    driver.get(url)
    time.sleep(10)
    try:
        price_xpaths = driver.find_elements_by_xpath(".//*[name()='svg']//*[name()='g']//*[name()='text']")
    except:
        print("price not found")

    for p in price_tags:
        print(p.text)

当我运行上述代码时,我得到一个空白列表以返回函数 find_elements_by_xpath。 我尝试了其他方法,例如切换到默认内容,因为该元素位于 #document

driver.switch_to_default_content()

但这也没有奏效。 如果有其他方法可以刮价格,请告诉我。

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
  • 首先尝试获取svg,如果获取它没有问题,然后尝试下一个元素,然后再尝试另一个元素 - 看看哪个元素有问题。顺便说一句:如果它是标签<svg> 那么也许你应该使用//svg//...
  • 顺便说一句:你的链接只给我消息Access Denied. You don't have permission to access "http://www.kbb.com/cadillac/deville/1996/sedan-4d/" on this server. - 所以不可能看到 HTML 并测试你的代码。
  • 代码没有错误,但可以说是'elementnotfound'错误。
  • 如果在重定向到页面时遇到“拒绝访问”,请尝试使用 vpn。

标签: python selenium svg web-scraping


【解决方案1】:

它是外部的SVG,似乎 Selenium 在 DOM 中没有它,所以我必须获取具有此 SVG 文件的 URL 的 <object>,在 data 中获取此 URL,使用 @ 下载它987654328@ 并使用BeautifulSoup 获取文本

from selenium import webdriver
import time
import requests
from bs4 import BeautifulSoup

url = 'https://www.kbb.com/cadillac/deville/1996/sedan-4d/'

driver = webdriver.Firefox()
driver.get(url)
time.sleep(5)

# doesn't work - always empty list
#price_xpaths = driver.find_elements_by_xpath(".//*[name()='svg']//*[name()='g']//*[name()='text']")
#price_xpaths = driver.find_elements_by_xpath('//svg')
#price_xpaths = driver.find_elements_by_xpath('//svg//g//text')
#price_xpaths = driver.find_elements_by_xpath('//*[@id="PriceAdvisor"]')
#print(price_xpaths)  # always empty list

# single element `object`
svg_item = driver.find_element_by_xpath('//object[@id="PriceAdvisorFrame"]')

# doesn't work - always empty string
#print(svg_item.get_attribute('innerHTML'))

# get url to file SVG
svg_url = svg_item.get_attribute('data')
print(svg_url)  

# download it and parse
r = requests.get(svg_url)
soup = BeautifulSoup(r.content, 'html.parser')

text_items = soup.find_all('text')
for item  in text_items:
    print(item.text)

结果:

Fair Market Range
$1,391 - $2,950
Fair Purchase Price
$2,171
Typical
Listing Price
$2,476


顺便说一句: 其他用户的信息:我必须使用代理/VPN,IP 位于US 才能看到此页面。对于位置PL,它显示

Access Denied. 
You don't have permission to access "http://www.kbb.com/cadillac/deville/1996/sedan-4d/" on this server.

有时即使是在US 的位置,它也会给我这个消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 2020-11-05
    • 1970-01-01
    • 2021-12-21
    • 2020-11-11
    • 1970-01-01
    • 2016-01-11
    • 2021-09-08
    相关资源
    最近更新 更多