从SVG提取数据

时间:2019-09-13 00:32:19

标签: python html selenium beautifulsoup

我将以下代码保存到本地html文件

<object id="PriceAdvisorFrame" type="image/svg+xml" data="https://www.kbb.com/Api/3.9.448.0/71071/vehicle/upa/PriceAdvisor/meter.svg?action=Get&amp;intent=buy-used&amp;pricetype=Private Party&amp;zipcode=99517&amp;vehicleid=439604&amp;hideMonthlyPayment=True&amp;condition=verygood&amp;mileage=11795" style="width: 100%;"></object>

我试图在Chrome浏览器中执行html时从HTML中提取费用。我尝试解析的HTML代码如下所示。但是,使用硒请求文件时,此代码不会出现。

<text xmlns="http://www.w3.org/2000/svg" text-anchor="middle" font-size="14" font-weight="700" fill="#333333" y="-8">$27,938</text>
<text xmlns="http://www.w3.org/2000/svg" text-anchor="middle" font-size="14" font-weight="400" fill="#333333" y="-26">Private Party Value</text>
<text xmlns="http://www.w3.org/2000/svg" text-anchor="middle" font-size="20" font-weight="700" fill="#ffffff" y="-48">$26,995 - $28,888</text>
<text xmlns="http://www.w3.org/2000/svg" text-anchor="middle" font-size="14" font-weight="400" fill="#ffffff" y="-68.8">Private Party Range</text>

到目前为止,这是我的代码:

options = webdriver.ChromeOptions()
options.add_argument('headless')
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36'    
options.add_argument('user-agent={0}'.format(user_agent))
driver = webdriver.Chrome(chrome_options=options)

driver.get('file:///F:/Onedrive/Python/KBB/test.html')
print(driver.find_element_by_css_selector('text').text)

关于如何进行这项工作的任何想法?

3 个答案:

答案 0 :(得分:0)

您指的'text'不是css_selector,而是tag_name。您可以使用.find_elements_*收集所有元素,然后提取它们的文本。

driver.get('file:///F:/Onedrive/Python/KBB/test.html')

elements = driver.find_elements_by_tag_name('text')
for element in elements:
    text = element.text
    if "$" in text:
        print(text)

答案 1 :(得分:0)

加载到浏览器中的html在driver.page_source中没有您想要的信息,因此您不能以这种方式进行选择。浏览器本身基于data属性发出GET请求,并呈现新内容-但是文件未更新。您可以.getdata的源或使用requests

enter image description here

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(r'path\chromedriver.exe')
driver.get(r'C:\Users\User\Desktop\test.html')
print(driver.page_source)
driver.get(driver.find_element_by_css_selector('[data]').get_attribute('data'))
elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR , 'text')))
if elem is not None:
    print(elem.text)

答案 2 :(得分:0)

要访问SVG元素,您需要使用以下xpath。

  

// * [name()='文本']

  

// * [local-name()='text']

尝试以下代码。

elements=WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.XPATH,"//*[name()='text']")))
for ele in elements:
  print(ele.text)

要执行上述代码,您需要导入以下内容。

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait