【问题标题】:playwright python iterating through HTML table剧作家 python 遍历 HTML 表
【发布时间】:2022-06-21 16:53:10
【问题描述】:

目前正在处理网页上 HTML 表格中的数据,如下所示:

我有以下使用 playwright 的 python 代码:

from config import CLINK_ID, CSA_PWD, MY_URL
from playwright.sync_api import sync_playwright
import time

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto(MY_URL)
    page.fill('input#username', CLINK_ID)
    page.fill('input#password', CSA_PWD)
    page.click('button.btn.btn-lg.btn-primary.btn-block')
    page.wait_for_load_state()
    page.hover('body > div:nth-child(1) > div.top-menu > div > nav > ul > li:nth-child(3) > a')
    page.click('body > div:nth-child(1) > div.top-menu > div > nav > ul > li:nth-child(3) > ul > li:nth-child(3) > a') # GWL compare
    page.wait_for_load_state()
    page.select_option('#listTable_length > label > select', value="-1") # show all entries
    page.wait_for_load_state(timeout=0)
    table = page.locator('//*[@id="listTable"]')
    row = (table.locator('tr'))
    print(row.locator('td').all_text_contents())  

期望收到带有表格内容的控制台输出。但输出是: 我很确定日期是存在的,因为我在使用 selenium 时收到了预期的结果,代码如下:

from config import CLINK_ID, CSA_PWD, MY_URL
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome("C:\\Users\\BF6141\\Documents\\chromedriver_win32\\chromedriver.exe")
url = MY_URL
driver.get(url=url)
driver.find_element_by_xpath('//*[@id="username"]').send_keys(CLINK_ID)
driver.find_element_by_xpath('//*[@id="password"]').send_keys(CSA_PWD)
driver.find_element_by_xpath('/html/body/div/form/button').click()
element_to_hover = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/nav/ul/li[2]/a')
hover = ActionChains(driver=driver).move_to_element(element_to_hover)
hover.perform()
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/nav/ul/li[2]/ul/li[3]/a').click() # GWL compare
driver.find_element_by_xpath('//*[@id="listTable_length"]/label/select/option[5]').click() # show all entries
driver.implicitly_wait(3)
table = driver.find_element_by_xpath('//*[@id="listTable"]')
time.sleep(2)
for row in table.find_elements_by_css_selector('tr'):
    for d in row.find_elements_by_css_selector('td'):
        print(d.text)

输出如下:

我希望在剧作家身上看到类似的东西。 我知道我没有使用剧作家代码迭代内容(我不知道该怎么做,因为当我使用定位器选择元素并尝试放置一个 for 循环时,它会抛出一个异常,定位器对象不是可迭代),这是我能走的最远的地方。 我确实尝试遵循剧作家here 的文档但没有成功。如果有人对我如何像使用 selenium 一样使用 playwright 获取数据有任何建议,我将不胜感激。

【问题讨论】:

    标签: python selenium html-table playwright-python


    【解决方案1】:

    我可以通过简单地将slow_mo=300 参数传递给launch() 函数来解决这个问题,所以,browser 变量的代码现在看起来像这样:

    browser = p.chromium.launch(slow_mo=300)
    

    我不确定这是否对其他人有帮助,但它解决了我的问题。

    令人震惊。

    【讨论】:

      【解决方案2】:

      参数slow_mo 具有误导性。您应该做的是将'networkilde' 传递给您的page.wait_for_load_state(),例如page.wait_for_load_state('networkilde') 或使用locator

      对于将来提及此内容的任何人,slow_mo 会减慢渲染速度,从而为 DOM 提供更多时间来加载数据,它只是来自playwright 的调试工具

      除非他们正在调试自动化,否则不应使用已接受的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-22
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 2021-02-19
        • 2021-08-02
        • 2022-12-06
        • 2021-12-28
        相关资源
        最近更新 更多