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

标签 python html selenium web-scraping

请帮忙。我正在尝试从网站获取数据,然后计算某些文本的出现次数。不幸的是,我无法提供实际的网站,但基本信息是这样的。

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

<小时/>

标题

<小时/>

表1

<小时/>

A00001

A00002

A00003

A00004

……

A00500

<小时/>

上面的每一行(A00001-A00500)代表我需要单击的表链接。此外,每个链接都指向一个独特的页面,我需要从中提取信息。

我正在使用 selenium 来获取信息并将其存储为变量数据,如下面的代码所示。但这是我的问题 - 我需要单击的链接/行数将取决于我的用户在 GUI 中选择的时间范围。正如您从我的代码中看到的,从 5/1/2011 到 5/30/2011 的时间范围生成了我需要点击的 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)

如果名称 ==“主要”: 单元测试.main()

我对两件事感到困惑。

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

number_of_links = input("页面上有多少个链接?") sel.get_table("//div[@id='cmecfMainContent']/center[2]/number_of_links")

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

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

A00002 指向包含表值“Oranges”的页面

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

我知道selenium可以将它们存储为变量,但我不确定是否可以将它们保存为序列类型,每个额外的出现都被附加到原始列表(或添加到字典),这然后可以使用 len() 函数进行计数。

感谢您的帮助

最佳答案

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

然后,要单击每个路径,您可以使用 [1] 之类的元素选择器附加您的 xpath,因此,如果您的 xpath 是 //somexpath/something ,请执行//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 并获取匹配数以获得链接总数,然后 for 循环遍历它们。如果你不能用 xpath 做到这一点,请继续假设它们是另一个链接,直到你得到接受

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

关于Python + Selenium - 网页抓取和计算 HTML 中某些文本数据的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6193063/

相关文章:

html - 如何实现像鸡蛋一样的边框半径

css - 无法让 div 在调整大小时消失

python - Selenium 错误: element click intercepted:Other element would receive the click:

html - 使用 HTML/CSS 将元素置于 DIV 中

Python Selenium - 等到表单提交后加载下一页

java - 当我输入 Excel 文件时,如何使我的路径在 selenium apache poi 中相对?以及执行测试后如何将测试结果写入Excel

python - 使用 TFlearn 塑造线性回归数据

python - 有效地将大型 numpy 数组切片复制到较小的连续内存数组

python - 标准化 Python Pandas 数据框中的某些列?

python - 我将如何获得 : in a string Python 之前的所有内容