【问题标题】:How to scrape hidden text from a web page?如何从网页中抓取隐藏的文本?
【发布时间】:2016-08-26 22:52:33
【问题描述】:

我正在尝试从网页中抓取一些文本。在我的网页上显示了一个单词列表。当我单击“+ 更多”时,其中一些是可见的,而另一些则是可见的。单击后,单词列表始终相同(相同顺序相同的单词)。然而,其中一些是粗体的,一些是被删除的。所以基本上数据库的每个项目都有一些特征。我想做什么:对于每个项目,告诉我哪些功能可用,哪些不可用。我的问题是克服“+ More”按钮。

我的脚本仅适用于那些显示的单词,而不适用于那些被“+ More”隐藏的单词。我要做的是收集节点“del”下的所有单词。我最初认为通过 lxml,网页会在 chrome 检查元素中出现时被加载,我相应地编写了我的代码:

from lxml import html

tree = html.fromstring(br.open(current_url).get_data())

mydata={}

if len(tree.xpath('//del[text()='some text']')) > 0:
    mydata['some text'] = 'text is deleted from the web page!'
else:
    mydata['some text'] = 'text is not deleted'

每次我运行这段代码时,我可以收集的实际上是网页上显示的数据的一部分,而不是点击“+更多”后会显示的完整单词列表。

我曾尝试过 selenium,但据我了解,它不是用于解析,而是用于与网页交互。但是,如果我运行这个:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.mywebpage.co.uk')

a = driver.find_element_by_xpath('//del[text()="some text"]')

我要么得到元素,要么得到一个错误。我想得到一个空列表,所以我可以这样做:

mydata = {}

if len(driver.find_element_by_xpath('//del[text()="some text"]')) > 0:
    mydata['some text'] = 'text is deleted from the web page!'
else:
    mydata['some text'] = 'text is not deleted'

或找到另一种方法来获取脚本捕获的这些“隐藏”元素。

我的问题是有人遇到过这种问题吗?他们是怎么解决的?

【问题讨论】:

    标签: python-2.7 selenium web-scraping lxml


    【解决方案1】:

    如果我理解正确,您想在列表中查找元素。但是,如果元素在页面上不可用,Selenium 会抛出 ElementNotFoundException 而不是返回列表。

    我的问题是你为什么想要一个列表?从您的示例来看,您想查看页面上是否存在元素。您可以通过使用 try/except 轻松实现此目的。

    from selenium.common.exceptions import TimeoutException
    
    try:
        driver.find_element_by_xpath('//del[text()="some text"]')
        mydata['some text'] = 'text is deleted from the web page!'
    except TimeOutException:
        mydata['some text'] = 'text is not deleted'
    

    现在,如果您真的需要此列表,您可以在页面中搜索多个元素。这将返回列表中与定位器匹配的所有元素。 为此替换:

    driver.find_element_by_xpath('//del[text()="some text"]')
    

    与(元素s):

    driver.find_elements_by_xpath('//del[text()="some text"]')
    

    【讨论】:

    • 嗨@RemcoW。感谢您的回答。是的,在我的网页上显示了一个单词列表。当我单击“+ 更多”时,其中一些是可见的,而另一些则是可见的。单击后,单词列表始终相同(相同顺序相同的单词)。然而,其中一些是粗体的,一些是被删除的。所以基本上数据库的每个项目都有一些特征。我想做什么:对于每个项目,告诉我哪些功能可用,哪些不可用。我的问题是克服“+更多”按钮。
    • 我的脚本只适用于那些显示的单词,而不适用于那些被“+ More”隐藏的单词。我会尝试你的代码并让你知道。我对硒的恐惧是它看起来很慢......
    • 它只是打开网页,并没有在我的字典中保存任何数据。 ;(
    • 你有没有机会给我看看这个列表的 HTML,或者创建一个类似的例子?
    • @user0978189 这是一个讨厌的页面。无论如何,我假设你想刮掉便利设施。您将无法读取所有隐藏的内容,因为它们还没有在 DOM 上。这意味着您必须获得更多按钮的 并首先单击它。之后,您可以查找所有隐藏的元素。
    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 2021-09-23
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多