Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SeleniumWebDriverPython检索SVG文本元素_Python_Html_Css_Svg_Selenium Webdriver - Fatal编程技术网

使用SeleniumWebDriverPython检索SVG文本元素

使用SeleniumWebDriverPython检索SVG文本元素,python,html,css,svg,selenium-webdriver,Python,Html,Css,Svg,Selenium Webdriver,我正在尝试使用SeleniumWebDriver(Firefox)从一个网站上获取有关大学课程的信息,在那里我们可以看到课程评论。。。。我可以让webdriver成功登录到网站并访问课程信息页面,但一旦我到了那里,我就无法访问整个课程评分的文本元素 以下是页面的外观: 课程评分表: 这就是文本元素HTML代码的样子: <text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif; opacity: 1;"

我正在尝试使用SeleniumWebDriver(Firefox)从一个网站上获取有关大学课程的信息,在那里我们可以看到课程评论。。。。我可以让webdriver成功登录到网站并访问课程信息页面,但一旦我到了那里,我就无法访问整个课程评分的文本元素

以下是页面的外观:

课程评分表:

这就是文本元素HTML代码的样子:

<text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif; 
opacity: 1;" x="438.00500259399416" y="131.25" text-anchor="middle" 
font="10px &quot;Arial&quot;" stroke="none" fill="#3c4c30" font-size="12px" 
font-family="Arial,Helvetica,sans-serif" font-style="normal" font-
weight="normal" transform="matrix(1,0,0,1,0,0)" opacity="1"><tspan 
dy="4">3.00</tspan></text>
3.00
以及svg代码:

<svg height="200" version="1.1" width="600" 
xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: 
relative; left: -0.5px; top: -0.866669px;"><rect x="0" y="0" width="600" 
height="200" r="0" rx="0" ry="0" fill="#ffffff" stroke="#ffffff" 
style="stroke-linejoin: round; stroke-linecap: square; stroke-opacity: 1; 
fill-opacity: 1;" stroke-linejoin="round" stroke-linecap="square" stroke-
width="1" stroke-opacity="1" fill-opacity="1"></rect>
.......</svg>

.......
首先,我尝试通过CSS选择器来识别元素(#chart>svg:nth child(1)>text:nth child(107)),但是我得到了一个nosucheelement异常

我认为下一个选项是通过XPath查找元素,但我不确定如何识别“3.00”元素,因为它没有特定的ID或类名

父元素1: (用于论文/习题集的条形图和文本) -纸张/PSET标签:

<text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif;" 
x="0" y="0" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" 
fill="#3c4c30" font-size="12px" font-family="Arial,Helvetica,sans-serif" 
font-style="normal" font-weight="normal" 
transform="matrix(1,0,0,1,128,102.0833)"><tspan dy="4">Papers, Reports, 
Problem Sets, Examinations</tspan></text>
论文、报告、,
习题集、考试
纸张/Psets栏:

<rect x="262.03334045410156" y="96.00694444444444" width="216.0105950756073" 
height="12.152777777777777" r="0" rx="0" ry="0" fill="#ffffff" 
stroke="#ffffff" style="stroke-linejoin: round; stroke-linecap: square; 
stroke-opacity: 0; opacity: 1; fill-opacity: 0;" stroke-linejoin="round" 
stroke-linecap="square" stroke-width="0" stroke-opacity="0" opacity="1" 
fill-opacity="0"></rect>

论文/PSET的数量评级:

<text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif; 
opacity: 1;" x="458.2356021327972" y="102.08333333333333" text-
anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#3c4c30" 
font-size="12px" font-family="Arial,Helvetica,sans-serif" font-
style="normal" font-weight="normal" transform="matrix(1,0,0,1,0,0)" 
opacity="1"><tspan dy="3.999997456868485">3.31</tspan></text>
3.31
家长要素2(其他学生的反馈栏)

反馈文本标签:

<text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif;" 
x="0" y="0" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" 
fill="#3c4c30" font-size="12px" font-family="Arial,Helvetica,sans-serif" 
font-style="normal" font-weight="normal" 
transform="matrix(1,0,0,1,175.3333,160.4167)"><tspan dy="4">Feedback for 
other students</tspan></text>

其他学生
反馈栏:

<rect x="262.03334045410156" y="154.34027777777777" 
width="232.3255947036743" height="12.152777777777777" r="0" rx="0" ry="0" 
fill="#ffffff" stroke="#ffffff" style="stroke-linejoin: round; stroke-
linecap: square; stroke-opacity: 0; opacity: 1; fill-opacity: 0;" stroke-
linejoin="round" stroke-linecap="square" stroke-width="0" stroke-opacity="0" 
opacity="1" fill-opacity="0"></rect>

反馈评分文本:

<text style="text-anchor: middle; font: 12px Arial,Helvetica,sans-serif; 
opacity: 1;" x="474.55060176086425" y="160.41666666666666" text-
anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#3c4c30" 
font-size="12px" font-family="Arial,Helvetica,sans-serif" font-
style="normal" font-weight="normal" transform="matrix(1,0,0,1,0,0)" 
opacity="1"><tspan dy="3.9999949137369697">3.56</tspan></text>
3.56
以下是网站正文的完整HTML代码,来源于page_source:

()

对于我试图用来查找元素的python代码:


()

如果没有更多的HTML,很难说正确的定位器是什么。我将从包含文本的实际元素开始,并避免使用诸如
nth-child()
之类的定位器,因为HTML很容易稍微更改,然后定位器指向错误的元素

您需要的元素是
3.00
。您是否尝试过一个简单的CSS选择器,例如,
tspan[dy='4']


我希望
dy
与文本位置相关,并且在页面上是唯一的。如果您可以发布包含“课程总体质量”标签的整行HTML和包含3.00的条形图,我认为可以创建XPath来查找所需内容。

如果没有更多HTML,很难说正确的定位器是什么。我将从包含文本的实际元素开始,并避免使用诸如
nth-child()
之类的定位器,因为HTML很容易稍微更改,然后定位器指向错误的元素

您需要的元素是
3.00
。您是否尝试过一个简单的CSS选择器,例如,
tspan[dy='4']


我希望
dy
与文本位置相关,并且在页面上是唯一的。如果您可以发布包含“课程总体质量”标签的整行HTML和包含3.00的条形图,我认为可以创建XPath来查找所需内容。

首先需要从iframe获取HTML。请看下面的答案:

将iframe中的代码设置为驱动程序后,以下是获取必要信息的完整代码:

tspans = driver.find_element_by_id('chart').find_elements_by_tag_name("tspan")
values = map(lambda x: x.get_attribute('innerHTML'), tspans)
length = len(values)
scores = {
"Lectures": values[length-2],
"Precepts": values[length-3],
"Readings": values[length-4],
"Papers, Reports, Problem Sets, Examinations": values[length-5],
"Overall Quality of the Course": values[length-6],
"Feedback for other students": values[length-7]
}
browser.close()
print scores
这将产生:

{'Lectures': u'2.71', 'Papers, Reports, Problem Sets, Examinations': u'3.31', 'Readings': u'3.67', 'Overall Quality of the Course': u'3.00', 'Feedback for other students': u'3.56', 'Precepts': u'3.43'}

首先,您需要从iframe获取html。请看下面的答案:

将iframe中的代码设置为驱动程序后,以下是获取必要信息的完整代码:

tspans = driver.find_element_by_id('chart').find_elements_by_tag_name("tspan")
values = map(lambda x: x.get_attribute('innerHTML'), tspans)
length = len(values)
scores = {
"Lectures": values[length-2],
"Precepts": values[length-3],
"Readings": values[length-4],
"Papers, Reports, Problem Sets, Examinations": values[length-5],
"Overall Quality of the Course": values[length-6],
"Feedback for other students": values[length-7]
}
browser.close()
print scores
这将产生:

{'Lectures': u'2.71', 'Papers, Reports, Problem Sets, Examinations': u'3.31', 'Readings': u'3.67', 'Overall Quality of the Course': u'3.00', 'Feedback for other students': u'3.56', 'Precepts': u'3.43'}

嘿,谢谢你的回复!下面是“touctions”元素的HTML代码,例如……我不认为dy对于行是唯一的:(`TESSIONS`这是该特定行的HTML元素:
课程的整体质量
和带有3.00:
的条形图的代码。是否可以根据x/y坐标识别该行?找到包含
文本
矩形
元素的最近父元素d在你的问题格式中发布整个区块。嘿,谢谢你的回复!这里是“讲座”元素的HTML代码,例如…我不认为dy对于行是唯一的:(`TESSIONS`这是该特定行的HTML元素:
课程的整体质量
和带有3.00:
的条形图的代码。是否可以根据x/y坐标识别该行?找到包含
文本
矩形
元素的最近父元素我只是需要用lis=list(值)将地图类型转换成一个列表。非常感谢!非常感谢!非常感谢!非常感谢@pthammahh是的,它工作了!!!!!我只是需要用lis=list(值)将地图类型转换成一个列表非常感谢!非常感谢!非常感谢@pthamm