使用Selenium/BeautifulSoup在HTML元素中查找模式

x759pob2  于 2022-12-09  发布在  其他
关注(0)|答案(2)|浏览(96)

我有这个html,我试图从冲浪热刮

<div class="event-round">
           <div id="heat-85940" class="new-heat  new-heat--status-completed new-heat--athletes-4">
           <div id="heat-85941" class="new-heat  new-heat--status-completed new-heat--athletes-4">
           <div id="heat-85942" class="new-heat  new-heat--status-completed new-heat--athletes-4">
           <div id="heat-85943" class="new-heat  new-heat--status-completed new-heat--athletes-4">
     <div>

我有一个循环创建刮热在每一页上,但因为热ID是变化的每一页(即不总是从85940开始),我只能得到1页的价值,而不手动改变范围i循环。
对于一个页面,我的代码如下所示:

heat_count = len(driver.find_elements(By.CLASS_NAME, 'new-heat-hd-name').text)

for h in range(heat_count):
    for i in range(4):
        name = driver.find_element(By.XPATH, f'//*[@id="heat-8594{h}"]/div/div[2]/div[{i + 1}]/div[1]/div[1]/div/div[2]/div[1]/span').text

我正在寻找一种方法,在html中搜索找到heat-85940,然后从那里开始,而不是手动找到它的每一页。

1tu0hz3e

1tu0hz3e1#

您可以尝试以下操作:
这里我只写XPath的开始部分-即,如何处理动态值'id=“heat-85940”',请填写剩余的XPath,因为你没有张贴的URL和完整的HTML源代码。

driver.find_element(By.XPATH, ".//*[starts-with(@id,'heat-')]...<remaining XPath until the element>")

driver.find_element(By.XPATH, ".//*[starts-with(@id,'heat-8594')]...<remaining XPath until the element>")
omjgkv6w

omjgkv6w2#

您可以尝试以下操作

# heats = driver.find_elements(By.XPATH, '//*[starts-with(@id,"heat-")]')
heats = driver.find_elements(By.CSS_SELECTOR, '*[id^="heat-"]')
for heat in heats:
    names = heat.find_elements(By.XPATH, '/div/div[2]/div/div[1]/div[1]/div/div[2]/div[1]/span')
    for n in names[:4]:
        name = n.text

# heats = driver.find_elements(By.XPATH, '//*[starts-with(@id,"heat-")]')
heats = driver.find_elements(By.CSS_SELECTOR, '*[id^="heat-"]')
for heat in heats:
    for i in range(4):
        name = heat.find_element(By.XPATH, f'/div/div[2]/div[{i + 1}]/div[1]/div[1]/div/div[2]/div[1]/span').text

(如果没有更多的html,我无法测试这些,所以我对它们中的任何一个都没有信心。)

相关问题