如何通过 Selenium 从 table 之类的对象中获取文本? (但实际上不是 table)
How to get text from table like object via Selenium? (but not actually a table)
鉴于 Power BI web 中的以下“table”:
table like object in Power BI Web with lists of Users and their emails
我需要 Selenium 逐行提取个人的电子邮件和姓名。 Table 行可能不同。
我已经设法得到 1 个电子邮件值,如下所示:
element = driver.find_element_by_xpath("//*[@id='artifactContentList']/div[1]/div[3]/div[2]/span")
element.text
但是,这与特定行相关联。其他行如下:
//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span
这是“table”的 HTML(仅包括第 1 行)
<cdk-virtual-scroll-viewport _ngcontent-thn-c40="" class="cdk-virtual-scroll-viewport cdk-virtual-scroll-orientation-vertical ng-star-inserted" id="artifactContentList" itemsize="50" maxbufferpx="400" minbufferpx="400">
<div class="cdk-virtual-scroll-content-wrapper" style="transform: translateY(0px);">
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
<!----><!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
<user-details _nghost-thn-c50="">
<!---->
<div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
<!----><!---->
<div _ngcontent-thn-c50="" class="user-icon-circle ng-star-inserted" style="width: 24px; height: 24px;">
<!---->
<div _ngcontent-thn-c50="" class="ng-star-inserted" style="font-size: 10.08px;">GE</div>
<!---->
</div>
</div>
<!---->
<div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
<!---->
<div _ngcontent-thn-c50="" class="user-name ng-star-inserted">Dashboard Name Here</div>
<!---->
</div>
</user-details>
</user-details-host>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="email@onmicrosoft.com" style="width: 385px;">email@onmicrosoft.com</span>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-permissions ng-star-inserted" role="cell" title="Member (Owner)" style="width: 132px;">Member (Owner)</span>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<update-permissions-context-menu _ngcontent-thn-c39="" class="context-menu ng-star-inserted" menuicon="pbi-glyph-more">
<!---->
<mat-menu class="">
<!---->
</mat-menu>
</update-permissions-context-menu>
</div>
<!---->
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
<!----><!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
<user-details _nghost-thn-c50="">
<!---->
<div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
<!----><img _ngcontent-thn-c50="" alt="User profile image" src="blob:https://app.powerbi.com/f999999-9999-999-9a99-b977b9b59886" class="ng-star-inserted" style="width: 24px; height: 24px;"><!---->
</div>
<!---->
<div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
<!---->
<div _ngcontent-thn-c50="" class="user-name ng-star-inserted">John Doe</div>
<!---->
</div>
</user-details>
</user-details-host>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="jdoe@onmicrosoft.com" style="width: 385px;">jdoe@onmicrosoft.com</span>
谢谢!
您需要对多个网络元素使用 find_elements
。
如果您查看您拥有的 xpath 模式:
//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span
你会在这里看到一个序列。
div[2]
然后 div[3]
和 div[4]
现在你可以做的是执行 xpath 索引:
div[{count}]
示例代码:
counter = 1
for element in driver.find_elements_by_xpath(f"//[@id='artifactContentList']/div[1]/div[{counter}]/div[2]/span"):
print(element.text)
counter = counter + 1
鉴于 Power BI web 中的以下“table”:
table like object in Power BI Web with lists of Users and their emails
我需要 Selenium 逐行提取个人的电子邮件和姓名。 Table 行可能不同。
我已经设法得到 1 个电子邮件值,如下所示:
element = driver.find_element_by_xpath("//*[@id='artifactContentList']/div[1]/div[3]/div[2]/span")
element.text
但是,这与特定行相关联。其他行如下:
//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span
这是“table”的 HTML(仅包括第 1 行)
<cdk-virtual-scroll-viewport _ngcontent-thn-c40="" class="cdk-virtual-scroll-viewport cdk-virtual-scroll-orientation-vertical ng-star-inserted" id="artifactContentList" itemsize="50" maxbufferpx="400" minbufferpx="400">
<div class="cdk-virtual-scroll-content-wrapper" style="transform: translateY(0px);">
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
<!----><!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
<user-details _nghost-thn-c50="">
<!---->
<div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
<!----><!---->
<div _ngcontent-thn-c50="" class="user-icon-circle ng-star-inserted" style="width: 24px; height: 24px;">
<!---->
<div _ngcontent-thn-c50="" class="ng-star-inserted" style="font-size: 10.08px;">GE</div>
<!---->
</div>
</div>
<!---->
<div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
<!---->
<div _ngcontent-thn-c50="" class="user-name ng-star-inserted">Dashboard Name Here</div>
<!---->
</div>
</user-details>
</user-details-host>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="email@onmicrosoft.com" style="width: 385px;">email@onmicrosoft.com</span>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-permissions ng-star-inserted" role="cell" title="Member (Owner)" style="width: 132px;">Member (Owner)</span>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<update-permissions-context-menu _ngcontent-thn-c39="" class="context-menu ng-star-inserted" menuicon="pbi-glyph-more">
<!---->
<mat-menu class="">
<!---->
</mat-menu>
</update-permissions-context-menu>
</div>
<!---->
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
<!----><!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!---->
<user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
<user-details _nghost-thn-c50="">
<!---->
<div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
<!----><img _ngcontent-thn-c50="" alt="User profile image" src="blob:https://app.powerbi.com/f999999-9999-999-9a99-b977b9b59886" class="ng-star-inserted" style="width: 24px; height: 24px;"><!---->
</div>
<!---->
<div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
<!---->
<div _ngcontent-thn-c50="" class="user-name ng-star-inserted">John Doe</div>
<!---->
</div>
</user-details>
</user-details-host>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="jdoe@onmicrosoft.com" style="width: 385px;">jdoe@onmicrosoft.com</span>
谢谢!
您需要对多个网络元素使用 find_elements
。
如果您查看您拥有的 xpath 模式:
//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span
你会在这里看到一个序列。
div[2]
然后 div[3]
和 div[4]
现在你可以做的是执行 xpath 索引:
div[{count}]
示例代码:
counter = 1
for element in driver.find_elements_by_xpath(f"//[@id='artifactContentList']/div[1]/div[{counter}]/div[2]/span"):
print(element.text)
counter = counter + 1