鱼C论坛

 找回密码
 立即注册
查看: 385|回复: 5

[已解决]为啥playwright取不出第一条记录,其它记录都能取出来

[复制链接]
发表于 2024-1-16 12:11:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from playwright.sync_api import Playwright, sync_playwright, expect
  2. import time


  3. def run(playwright: Playwright) -> None:
  4.     browser = playwright.chromium.launch(headless=False)
  5.     context = browser.new_context()
  6.     page = context.new_page()
  7.     page.goto("https://yxcx.cscse.edu.cn/rzyxmd")
  8.     time.sleep(15)
  9.     page.get_by_role("button", name="已 阅").click()
  10.     page.locator("label").filter(has_text="F").click()
  11.     page.get_by_text("法国").click()


  12.     for i1 in range(1, 2):
  13.         for i2 in range(1, 21):
  14.             print(i2, '-----', page.inner_text(f"//*[@id='app']/div/div[3]/div[1]/div/div[2]/div[{i2}]"))
  15.             # print(i2, '-----', page.get_by_text(f"//*[@id='app']/div/div[3]/div[1]/div/div[2]/div[{i2}]"))

  16.     page.close()
  17.     context.close()
  18.     browser.close()



  19. with sync_playwright() as playwright:
  20.     run(playwright)
复制代码


1bad.jpg
最佳答案
2024-1-16 12:20:02
blackantt 发表于 2024-01-16 12:19
print(i2, '-----', page.inner_text(f"#app > div >  ...


如果使用了正确的选择器`#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child(1)`,但仍然无法取出第一条记录的内容,可能是由于网页加载速度导致的。在你的代码中,使用了`time.sleep(15)`来等待页面加载完成,但这种固定的等待时间并不适合所有情况。

我建议你尝试更稳健的等待策略,例如使用Playwright提供的等待方法`page.wait_for_selector(selector)`来确保元素的可见性和可交互性。这样可以避免由于页面加载时间不确定而导致的问题。下面是修改后的代码示例:

  1. from playwright.sync_api import Playwright, sync_playwright, expect
  2. import time

  3. def run(playwright: Playwright) -> None:
  4.     browser = playwright.chromium.launch(headless=False)
  5.     context = browser.new_context()
  6.     page = context.new_page()
  7.     page.goto("https://yxcx.cscse.edu.cn/rzyxmd")
  8.    
  9.     # 这里可以使用等待方法来等待页面加载完成,确保元素可见和可交互
  10.     page.wait_for_selector("#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child(1)")
  11.    
  12.     page.get_by_role("button", name="已 阅").click()
  13.     page.locator("label").filter(has_text="F").click()
  14.     page.get_by_text("法国").click()
  15.    
  16.     for i2 in range(1, 21):
  17.         print(i2, '-----', page.inner_text(f"#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child({i2})"))

  18.     page.close()
  19.     context.close()
  20.     browser.close()

  21. with sync_playwright() as playwright:
  22.     run(playwright)
复制代码


请注意,上述代码仅根据你提供的选择器进行了修改。如果选择器仍然无法正确定位到第一条记录,请确保选择器是准确的,并根据你的实际情况进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-16 12:12:04 | 显示全部楼层
playwright内部的方法`page.inner_text`是用于获取元素的文本内容的。在你的代码中,`page.inner_text(f"//*/div/div/div/div/div/div")`是通过XPath选择器寻找元素,并获取其文本内容。但是根据你提供的代码,这个XPath选择器似乎有问题,无法正确地获取第一条记录。

你可以尝试修改XPath选择器,确保它能够准确地定位到第一条记录元素。或者,你也可以尝试使用其他方法来获取元素的文本内容,比如`page.get_inner_text(selector)`方法。

下面是修复后的代码示例:

  1. from playwright.sync_api import Playwright, sync_playwright, expect
  2. import time

  3. def run(playwright: Playwright) -> None:
  4.     browser = playwright.chromium.launch(headless=False)
  5.     context = browser.new_context()
  6.     page = context.new_page()
  7.     page.goto("https://yxcx.cscse.edu.cn/rzyxmd")
  8.     time.sleep(15)
  9.     page.get_by_role("button", name="已 阅").click()
  10.     page.locator("label").filter(has_text="F").click()
  11.     page.get_by_text("法国").click()

  12.     for i2 in range(1, 21):
  13.         print(i2, '-----', page.inner_text(f"(//div[@class='xxxx'])[1]"))

  14.     page.close()
  15.     context.close()
  16.     browser.close()

  17. with sync_playwright() as playwright:
  18.     run(playwright)
复制代码


请注意,上述代码仅仅是假设了你的XPath选择器中使用了一个class为`xxxx`的div元素来表示每一条记录。你需要根据实际情况自行修改XPath选择器中的`xxxx`部分,以确保能够准确地定位到第一条记录。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-16 12:19:41 | 显示全部楼层
FishC 发表于 2024-1-16 12:12
playwright内部的方法`page.inner_text`是用于获取元素的文本内容的。在你的代码中,`page.inner_text(f"// ...

print(i2, '-----', page.inner_text(f"#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child({i2})"))  #用selector仍然取不出第1条!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-16 12:20:02 | 显示全部楼层    本楼为最佳答案   
blackantt 发表于 2024-01-16 12:19
print(i2, '-----', page.inner_text(f"#app > div >  ...


如果使用了正确的选择器`#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child(1)`,但仍然无法取出第一条记录的内容,可能是由于网页加载速度导致的。在你的代码中,使用了`time.sleep(15)`来等待页面加载完成,但这种固定的等待时间并不适合所有情况。

我建议你尝试更稳健的等待策略,例如使用Playwright提供的等待方法`page.wait_for_selector(selector)`来确保元素的可见性和可交互性。这样可以避免由于页面加载时间不确定而导致的问题。下面是修改后的代码示例:

  1. from playwright.sync_api import Playwright, sync_playwright, expect
  2. import time

  3. def run(playwright: Playwright) -> None:
  4.     browser = playwright.chromium.launch(headless=False)
  5.     context = browser.new_context()
  6.     page = context.new_page()
  7.     page.goto("https://yxcx.cscse.edu.cn/rzyxmd")
  8.    
  9.     # 这里可以使用等待方法来等待页面加载完成,确保元素可见和可交互
  10.     page.wait_for_selector("#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child(1)")
  11.    
  12.     page.get_by_role("button", name="已 阅").click()
  13.     page.locator("label").filter(has_text="F").click()
  14.     page.get_by_text("法国").click()
  15.    
  16.     for i2 in range(1, 21):
  17.         print(i2, '-----', page.inner_text(f"#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div > div:nth-child(2) > div:nth-child({i2})"))

  18.     page.close()
  19.     context.close()
  20.     browser.close()

  21. with sync_playwright() as playwright:
  22.     run(playwright)
复制代码


请注意,上述代码仅根据你提供的选择器进行了修改。如果选择器仍然无法正确定位到第一条记录,请确保选择器是准确的,并根据你的实际情况进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-16 12:29:55 | 显示全部楼层
FishC 发表于 2024-1-16 12:20
如果使用了正确的选择器`#app > div > div.el-card.box-card.is-always-shadow > div.el-card__body >  ...

这次你对了,真是 延迟问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-16 12:30:04 | 显示全部楼层
blackantt 发表于 2024-01-16 12:29
这次你对了,真是 延迟问题


太好了,我很高兴能够帮到你!网页加载速度可能会导致元素的可见性和可交互性出现延迟,因此使用等待方法来确保元素加载完成是一个很好的解决方案。如果你还有其他问题,欢迎随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表