Python + Selenium - Web抓取和计算HTML中某些文本数据的出现次数

时间:2011-05-31 20:16:50

标签: python html selenium web-scraping

请帮忙。我试图从网站获取数据,然后计算某些文本的出现次数。不幸的是,我不能提供实际的网站,但基础是这个。

网页已加载,我会看到一个值列表,这些值位于表格中(下面的代码反映了这一点)。该页面看起来像这样。


标题


表1


A00001

A00002

A00003

A00004

...

A00500


上述每一行(A00001- A00500)代表我需要点击的链接。此外,每个链接都会导致我需要从中提取信息的唯一页面。

我正在使用selenium来获取信息并将其存储为可变数据,如下面的代码所示。这是我的问题 - 我需要点击的链接/行数取决于我的用户在GUI中选择的时间范围。从我的代码中可以看出,从2011年5月1日到2011年5月30日的时间范围产生了一个包含我需要点击的184个不同链接的列表。

from selenium import selenium
import unittest, time, re

class Untitled(unittest.TestCase):
def setUp(self):
    self.verificationErrors = []
    self.selenium = selenium("localhost", 4444, "*chrome", "https://www.example.com")
    self.selenium.start()

def test_untitled(self):
    sel = self.selenium
    sel.open("https://www.example.com")
    sel.click("link=Reports")
    sel.wait_for_page_to_load("50000")
    sel.click("link=Cases")
    sel.wait_for_page_to_load("50000")
    sel.remove_selection("office", "label=")
    sel.add_selection("office", "label=San Diego")
    sel.remove_selection("chapter", "label=")
    sel.add_selection("chapter", "label=9")
    sel.add_selection("chapter", "label=11")
    sel.type("StartDate", "5/1/2011")
    sel.type("EndDate", "5/30/2011")
    sel.click("button1")
    sel.wait_for_page_to_load("30000")
    Case 1 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.1.0")
    Case 2 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.2.0")
    Case 3 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.184.0")

def tearDown(self):
    self.selenium.stop()
    self.assertEqual([], self.verificationErrors)

如果名称 ==“主要”:     unittest.main()

我对两件事感到困惑。

1)在不知道提前链接数量的情况下,让selenium点击页面上的所有链接的最佳方法是什么?我知道如何执行此操作的唯一方法是让用户选择GUI中的链接数,这些链接将分配给变量,然后可以包含在以下方法中:

number_of_links =输入(“页面上有多少个链接?”) sel.get_table( “// DIV [@ ID = 'cmecfMainContent'] /中心[2] / NUMBER_OF_LINKS”)

2)我也对如何计算链接所在页面上出现的某些数据的出现感到困惑。

A00001指向包含表值“Apples”

的页面

A00002会指向包含表值“Oranges”

的页面

A00003指向包含表值“Apples”的页面 “

我知道selenium可以将它们存储为变量,但我不确定是否可以将它们保存为序列类型,每个附加的事件都附加到原始列表(或添加到字典中),然后可以用len()函数计算。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

我对python api并不熟悉,对不起,但在java中我知道使用xpath有一个函数来获取xpath的出现次数。因此,您可以编写一个xpath选择器来查找所需的元素,然后获取该路径的出现次数。

然后点击每一个你可以用[1]之类的元素选择器粘贴你的xpath,所以如果你的xpath是//somexpath/something do //somexpath/something[1]来得到第一个。

希望有所帮助

下面是一个例子:我在java中编写了一个糟糕的api,能够像xpath匹配集合那样对jquery进行操作。我的构造函数匹配xpath得到计数然后创建所有匹配的列表,所以我可以做像.clickAll()

这样的事情
 public SelquerySelector(String selector, Selenium selenium) {
        super("xpath=(" + selector + ")[" + 1 + "]", selenium);
        this.xpath = selector;
        this.selenium = selenium;
        //find out how many elements match
        this.length = selenium.getXpathCount(this.xpath).intValue();
        //make an array of selectedElements
        for(int i = 2; i <= this.length; i++) {
            elements.add(new SelquerySelectedElement("xpath=(" + this.xpath + ")[" + i + "]", this.selenium));
        }
    }

如果你想看到它,请提供整个代码:

<强> http://paste.zcd.me/Show.h7m1?id=8002

所以我想回答你的问题(不知道xpath如何匹配表)你可能会做类似

的事情

//div[@id='cmecfMainContent']/center[2]/table并获取匹配的数量以获得链接的总量然后循环它们。如果你不能用xpath做到这一点,请继续假设它们是另一个链接,直到你得到一个接受

for i in range(1,xpathmatchcount):
    Case[i] = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table." + i + ".0")