【问题标题】:get text node from strange html by selenium+python通过 selenium+python 从奇怪的 html 中获取文本节点
【发布时间】:2013-12-06 08:06:10
【问题描述】:

我需要从这个页面上抓取电话号码,例如 - http://m.avito.ru/sankt-peterburg/muzykalnye_instrumenty/shesti_strunnoe_bandzho_stroy_gitarnyy_203671253

左蓝色按钮执行此 ajax 请求并返回电话号码,而不是在 innerText 中,而是在像这样的单独 text() 节点中

<a href="tel:895**49****" class="button-text action-link" title="Телефон продавца" rel="nofollow">
"8 9** **9-99-**"
</a>

我点击这个按钮。等待 3-5 秒,然后尝试获取号码 但我不能像这样使用 .text

phone = driver.find_element_by_class_name('button-text')
print phone.text 

它只返回一个空字符串 当我尝试这样做时

print driver.find_element_by_xpath('/html/body/section/article/section[2]/ul/li[1]/a/text()')

或者这个

print driver.find_element_by_xpath('/html/body/section/article/section[2]/ul/li[1]/a/text()').text

它返回 InvalidSelectorException: Message: u'Error Message => \'xpath 表达式的结果 "/html/body/section/article/section[2]/ul/li[1]/a/ text()" 是:[对象文本]。它应该是一个元素。

【问题讨论】:

    标签: python dom text selenium selenium-webdriver


    【解决方案1】:

    前几天我遇到了类似的问题,发现如果元素不可见,text 方法会返回一个空字符串。您可以使用 javascript 滚动到元素。

    driver.execute_script("arguments[0].scrollIntoView(true);", element)
    

    注意:页面上有多个带有button-text 类的元素。如果您希望将它们都放在一个列表中,您可以执行以下操作:

    phone = driver.find_elements_by_class_name('button-text')
    phonenums = []
    for p in phone:
        p.click()
        driver.execute_script("arguments[0].scrollIntoView(true);", p)
        phonenums.append(p.text)
    

    但是,如果您只是想像这样抓取页面,我会尝试一种完全不同的方法。该页面似乎没有发出 ajax 请求,因此您应该能够简单地使用 requests 库获取源并对其进行解析。如果您确实需要/想要使用 Selenium,我会让它获取源代码 (source = driver.page_source) 并使用 lxml 解析它。

    我还应该注意,您的最终错误是由在文本节点上调用 text 方法引起的。我很确定 Selenium 无论如何都无法使用 /text() xpath 检索文本。

    【讨论】:

    • 哦,谢谢,但它也不起作用..我不知道他们使用什么保护方式,但这真的很烦人。我知道request、urlib2和lxml,但暂时我不明白它是如何工作的)
    • 您是否能够成功地从页面中获取其他文本节点?
    【解决方案2】:

    对 xpath 试试这个规则:

    print driver.find_element_by_xpath('//a[contains(@class, "button-text action-link")]/text()')
    

    演示:

    In [3]: print sel.xpath('//a[contains(@class, "button-text action-link")]/text()').extract()[0]
    Показать номер
    

    【讨论】:

    • returns InvalidSelectorException: Message: u'Error Message => \'xpath表达式的结果'//a[contains(@class, "button-text action-link")] /text()' 是:[对象文本]。它应该是一个元素。也是
    • 当我看到您的链接时,在我们按下“Показать номер”按钮之前,我们看不到卖家电话。这意味着我们可以在按下按钮后获得卖家的电话。
    • ammm...我在我的问题中写过它,我模拟点击,并且不能在它之后刮掉数字。
    猜你喜欢
    • 2021-01-08
    • 2019-06-12
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2017-12-27
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多