【问题标题】:Parse HTML Tables in Python - Click on Link in Cell在 Python 中解析 HTML 表格 - 单击单元格中的链接
【发布时间】:2019-01-28 05:52:14
【问题描述】:

我正在尝试解析 HTML 表格并单独单击第三列中的每个超链接(其中显示 href="javascript:showPayCheck)。有大量帖子显示如何解析表格,但我不能找不到任何看起来像我正在使用的表格:

<div class="screen-group-content">        
    <div class="checkview-checks">
        <table cellpadding="2px" class="asureTable" cellspacing="0px" style="border-collapse: collapse;">
            <tbody><tr class="trHeader">
                <td style="font-weight: bold;">Payment Date</td>
                <td style="font-weight: bold;">Payment Type</td>
                <td style="font-weight: bold;">Check/ACH</td>
                <td style="font-weight: bold;">View $</td>
            </tr>
                    <tr>
                        <td style="cursor: default;">01/18/2019</td>
                        <td style="cursor: default;">Regular Check</td>
                        <td style="cursor: default;">ACH</td>
                        <td style="cursor: default;"><a href="javascript:showPayCheck(589, 3106, 'REG', 'D');" title="View Check Detail">$3,023.10</a></td>
                    </tr>

                    <tr>
                        <td style="cursor: default;">01/04/2019</td>
                        <td style="cursor: default;">Regular Check</td>
                        <td style="cursor: default;">ACH</td>
                        <td style="cursor: default;"><a href="javascript:showPayCheck(588, 3106, 'REG', 'D');" title="View Check Detail">$3,141.80</a></td>
                    </tr>
        </tbody></table>
        </div>
</div>

我尝试过使用 BeautifulSoup:

import BeautifulSoup as bSoup
soup = bSoup(driver.page_source, "html.parser")
td_list = soup.findAll('td')
for td in td_list:
    print(td.text)

我已经尝试过 Selenium:

elems = driver.find_elements_by_name("td")
for elem in elems:
    print(elem.text)
    elem.click()

我什么都得不到。表的 XPath 是:

//*[@id="form1"]/div[3]/div/div/table 

我已经尝试通过 XPath 获取表格:

table=driver.find_element_by_xpath('//*[@id="form1"]/div[3]/div/div/table')
for elem in table:
    print(elem.text)

但我得到了错误:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="form1"]/div[3]/div/div/table"}

我做错了什么?

----编辑 抱歉,我不太擅长 HTML。这是元素在层次结构中的位置,它在 iFrame 中吗?

【问题讨论】:

  • 能否提供网址??
  • 检查表格是否在 frame/iframe 元素内
  • URL 在登录后面。让我刮掉整个页面。

标签: python selenium html-table beautifulsoup


【解决方案1】:

您的 xpath 可以更具体,建议您使用增量方法,首先尝试:

driver.find_element_by_xpath('//*[@id="form1"]//div[@class="screen-group-content"]')

如果上面返回True

driver.find_element_by_xpath('//*[@id="form1"]//div[@class="screen-group-content"]//table[@class="asureTable"]')

如果上面也是真的;那么你可以通过上面 Xpath 的索引来获取行和数据。 此外,请检查您的帖子中附加的 HTML sn-p 的上层结构中的任何帧。

【讨论】:

  • 感谢 Pooja。我从你的建议开始,发现这张桌子找不到了。它在 iFrame 中。详情见我的回答。
  • 是的,当简单的 xpath 不起作用时,iframe 就是答案......很高兴可以提供帮助。
【解决方案2】:

表格位于 iFrame 中。你必须选择它。继this之后,我将代码编辑如下:

wait = WebDriverWait(driver, 10)
wait.until(eConds.frame_to_be_available_and_switch_to_it((wdBy.CSS_SELECTOR, "iframe[id='hr2oScreen']:nth-of-type(1)")))
for table in wait.until(eConds.presence_of_all_elements_located((wdBy.CSS_SELECTOR, "table tr")))[1:]:
    data = [item.text for item in table.find_elements_by_css_selector("th,td")]
    print(data)

感谢 Pooja 为我提供有关如何确定文本不存在的指示。

【讨论】:

    【解决方案3】:

    您是否尝试过使用正则表达式?

    使用

    import re
    from selenium import webdriver
    
    #n = webdriver.Firefox() or n.webdriver.Chrome()
    n.get_url( your_url )
    
    html_source_code = str(n.page_source)
    # Using a regular expression
    # The element that you want to fetch/collect
    #    will be inside of the 'values' variable
    values = re.findall( r'title=\"View Check Detail\"\>(.+)\</td>', html_source_code )
    

    更新:如果内容在 iframe 内,使用 selenium + Chrome 驱动程序您可以这样做:

    from selenium import webdriver
    from selenium.webdriver.chrome import options
    
    o = options.Options()
    o.headless = True
    
    n = webdriver.Chrome(options=o)
    n.get_url( your_url )
    links = n.find_elements_by_tag_name("iframe")
    outer = [ e.get_attribute("src") for e in links]
    
    # In the best case outer will be a list o strings,
    # each outer's element contain the values of the src attribute. 
    # Compute the correct element inside of outer
    
    n.get_url(correct_outer_element) 
    # This will make a 'new' html code.
    # Create a new xpath and fetch the data!
    

    【讨论】:

    • 在 webdriver 的选项类中启用“--headless”,web 浏览器窗口将不会打开
    • 我尝试了正则表达式,但没有找到它。我已经尝试打印 (print (elem.text)) 所有元素,但我没有得到任何结果。
    • @SteveGon 现在我可以理解它发生了什么!。你能看到 html iframe 标签吗?跟随 src 属性,它是一个链接。该链接的内部将是另一个页面,其中包含在 iframe 标记内创建整个 html 代码的脚本或 javascript。 iframe在一个html里面生成一个html,穿不?实际上我找到了具有这种结构的 html 页面。再次,点击 ifrma 内的 src 链接并查看新的 html 代码,可能是您找到了 json 语法,使用 regex 进行感染。跨度>
    • @SteveGon 你能分享 src 链接添加器或 src 链接内的 html 代码吗?有时很难将数据提取到 iframe 中。
    • @SteveGon 另外,如果您从 selenium 下载整个 html 源代码,您将找不到 iframe 标记部分。这就是为什么您无法使用 regex 或 find selenium 方法获取任何数据的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2019-09-16
    • 2014-12-13
    • 2011-06-02
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多