【问题标题】:Can't see the HTML in the element看不到元素中的 HTML
【发布时间】:2012-01-25 05:03:41
【问题描述】:

我可以登录并访问我的帐户页面,这里是 HTML 示例(为简洁起见进行了修改,不超过 URL 限制):

    <div class='table m_t_4'>
<table class='data' border=0 width=100% cellpadding=0 cellspacing=0>
    <tr class='title'>
        <td align='center' width='15'><a></a></td>
        <td align='center' width='60'></td>
    </tr>
    <TR bgcolor=>

        <td valign='top' align='center'>1</TD>
        <td valign='top' align='left'><img src='/images/sale_small.png' alt='bogo sale' />Garden Escape Planters</TD>
        <td valign='top' align='right'>13225</TD>
        <td valign='top' align='center'>2012-01-17 11:34:32</TD>
        <td valign='top' align='center'>FILLED</TD>
        <td valign='top' align='center'><A HREF='https://www.daz3d.com/i/account/orderdetail?order=7886745'>7886745</A></TD>
        <td valign='top' align='center'><A HREF='https://www.daz3d.com/i/account/req_dlreset?oi=18087292'>Reset</A>
    </TR>

请注意,我真正需要的唯一项目是第一个带有“order=7886745'>7886745

还有几个我需要阅读的 TR 块。

我正在使用以下 xpath 编码:

    browser.get('https://www.daz3d.com/i/account/orderitem_hist?')

account_history = browser.find_element_by_xpath("//div[@class='table m_t_4']");
print account_history

product_block = account_history.find_element_by_xpath("//TR[contains(@bgcolor, '')]");
print product_block

product_link = product_block.find_element_by_xpath("//TR/td/A@HREF")
print product_link

我正在使用 Python FireFox 版本的 webdriver。

当我运行它时,account_history 和 product_block xpath 似乎工作正常(它们打印为“none”,所以我认为它们工作),但我在 product_link 上收到“expession 不是合法表达式”错误。

我有两个问题:

1:为什么“//TR/td/A@HREF”xpath 不起作用?它应该使用 product_block - 它(应该)只是 TR 段,所以它应该以 TR 开头,然后查找具有 HREF 的第一个 td ...正确吗?

我尝试使用 HTML 中使用的确切大小写,但我认为这无关紧要...

2:我需要使用什么编码来查看元素的内容(HTML/文本)?

我需要能够执行此操作以获取下一页调用所需的 URL。

我还想确定这里正在读取正确的 HTML...这应该是调试的正常部分,恕我直言。

元素数据如何存储?它是否在我可以使用 Python 读取的数组或表中?它必须在某个地方可用,才能在测试中发挥作用——不是吗?

我很抱歉让我如此困惑,但我在网上看到了很多关于此的信息,但其中大部分要么没有任何作用,要么会导致错误。

似乎没有任何“标准”编码规则可用......所以我在这里有点绝望......

到目前为止,我真的很喜欢我在 Selenium 中看到的东西,但我需要克服它才能完成这项工作!

已编辑!

好的,睡了一会儿后,第一个答案提供了线索 - find_elements_by_xpath 创建了一个列表...所以我用它来查找所有 xpath("//a[contains(@href,'https://www .daz3d.com/i/account/orderdetail?order=')]");整个历史记录中的元素,然后访问它创建的列表...并将其写入文件以确保我看到的内容。

修改后的代码:

    links = open("listlinks.txt", "w")
browser.get('https://www.daz3d.com/i/account/orderitem_hist?')

account_history = browser.find_element_by_xpath("//div[@class='table m_t_4']");
print account_history.get_attribute("div")

product_links = []
product_links = account_history.find_elements_by_xpath("//a[contains(@href,'https://www.daz3d.com/i/account/orderdetail?order=')]");
print str(len(product_links)) + ' elements'
for index, item in enumerate(product_links):
    link = item.get_attribute("href")
    links.write(str(index) + '\t' + str(link) + '\n')

这为我提供了包含我需要的链接的文件...

    0   https://www.daz3d.com/i/account/orderdetail?order=7905687
1   https://www.daz3d.com/i/account/orderdetail?order=7886745
2   https://www.daz3d.com/i/account/orderdetail?order=7854456
3   https://www.daz3d.com/i/account/orderdetail?order=7812189

如此简单,以至于绊倒我都看不到它......

谢谢!

【问题讨论】:

    标签: python selenium webdriver


    【解决方案1】:

    1:为什么“//TR/td/A@HREF”xpath 不起作用?它应该是 使用 product_block - 它(应该)只是 TR 段,所以 它应该从 TR 开始,然后寻找第一个具有 HREF...正确吗?

    WebDriver 只返回元素,而不是所述元素的属性,因此:

    "//TR/td/A" 
    

    有效,但是

    "//TR/td/A@HREF"
    

    "//TR/td/A@ANYTHING"
    

    没有。

    2:我需要使用什么编码来查看内容(HTML/文本) 元素?

    要检索内部文本:

    string innerValue = element.Text;
    

    要检索内部html:

    • 这有点困难,您需要遍历每个子元素并在此基础上重建 html - 或者您可以使用 scraping tool 处理 html。

    检索属性:

    string hrefValue = element.GetAttribute("href");
    

    (C#,希望你能翻译成 Python)

    【讨论】:

    • 请看我上面的编辑——你们俩都给了我线索,我只需要在上面睡觉!谢谢!
    【解决方案2】:

    除了browser.find_element_by_xpath之外,还有其他方法可以访问元素。

    您可以通过例如访问id,或class

    browser.find_element_by_id
    browser.find_element_by_link_text
    
    browser.find_element
    browser.find_element_by_class_name
    browser.find_element_by_css_selector
    browser.find_element_by_name
    browser.find_element_by_partial_link_text
    browser.find_element_by_xpath
    browser.find_element_by_tag_name
    

    以上每个都有一个类似的函数返回一个列表(只需将element替换为elements

    注意:我将前两行分开,因为我认为它们可能会对您有所帮助。

    【讨论】:

    • 这是真的 - 但在这种情况下,行 daz3d.com/i/account/…> 似乎缺少任何其他方法。 . 没有类,没有 id,没有名字 - 链接中的文本不是恒定的......这就是我尝试 xpath 的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多