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