以下是html代码的摘录:
<div class="Class1">Category1</div>
<div class="Class2">"Text1 I want"</div>
<div class="Class1">Category2</div>
<div class="Class2">"Text2 I want"</div>
我知道我可以使用:
提取Text1和Text2find_element = browser.find_elements_by_xpath("//div[@class='Class2']")
element = [x.text for x in find_element]
text1 = element[0]
text2 = element[1]
但是如果更改了html的结构,则会相应地更改元素。我有没有办法通过分别引用Category1和Category2来提取Text1和Text2?
谢谢。
答案 0 :(得分:1)
如果Text I want
始终位于div
的下一个同级Category div
内,您可以尝试以下操作:
案例1
<div class="Class1">Category1</div>
<div class="Class2">"Text1 I want"</div>
//div[.='Category1']/following-sibling::div[1]
案例2
<div class="Class1">Category1</div>
<div class="Class2">
<div class="xxx">
<span>"Text1 I want"</span>
</div>
</div>
//div[.='Category1']/following-sibling::div[1]//span
可能有许多可能的结构,xpath中的关键部分是//div[.='Category1']/following-sibling::div[1]
答案 1 :(得分:0)
我建议使用BeautifulSoup。找到Category1标记,然后找到它的next_sibling
:
import bs4
your_html = browser.page_source
soup = bs4.BeautifulSoup(your_html, 'lxml')
class1tag = soup.find('div', text='Category1')
tag = class1tag.next_sibling.next_sibling
print(tag)
#<div class="Class2">"Text1 I want"</div>
print(tag.text)
#"Text1 I want"
答案 2 :(得分:0)
我猜你对html结构变化的关注是基于这样一个事实,即数据的语义是支付的键值(键是类别,值是文本),而结构只是一个div列表,其中奇数是键,下面的偶数是它们对应的值。 问题不在于你的Selenium定位器,而在于html本身的结构(这会影响你使用更强大的定位器的能力)。我建议你要求开发人员改进html的结构以反映它的适当语义。一起讨论 最适合所有需求的结构,包括测试自动化的结构。