1

データを取り、タグなしで整理したい。こんな感じです

<table class="SpecTable">
    <col width="40%" />
    <col width="60%" />
    <tr>
        <td class="LightRowHead">Optical Zoom:</td>
        <td class="LightRow">15x</td>
    </tr>
    <tr>
        <td class="DarkRowHead">Digital Zoom:</td>
        <td class="DarkRow">6x</td>
    </tr>
    <tr>
        <td class="LightRowHead">Battery Type:</td>
        <td class="LightRow">Alkaline</td>
    </tr>
    <tr>
        <td class="DarkRowHead">Resolution Megapixels:</td>
        <td class="DarkRow">14 MP</td>
    </tr>
</table>

そして、すべての情報の文字列を抽出して、これだけでプレーンテキスト ファイルに保存できるようにしたいと考えています。

光学ズーム: 15 倍 デジタル ズーム: 6 倍 バッテリーの種類: アルカリ 解像度 メガピクセル: 14 MP

public static void main(String[] args) {

        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("general.useragent.override", "some UA string");
        WebDriver driver = new FirefoxDriver(profile);

        String Url = "http://www.walmart.com/ip/Generic-14-MP-X400-BK/19863348";
        driver.get(Url);
        List<WebElement> resultsDiv = driver.findElements(By.xpath("//table[contains (@class,'SpecTable')//td"));

        System.out.println(resultsDiv.size());
        for (int i=0; i<resultsDiv.size(); i++) {
            System.out.println(i+1 + ". " + resultsDiv.get(i).getText());
        }

Selenium を使用して Java でプログラミングしていますが、正しい XPath 式がわかりません。

誰かが私がこれを間違えた理由を理解し、このデータを正しく解析する方法についていくつかの指針を教えてもらえますか? 私は Selenium と XPaths に非常に慣れていませんが、仕事にはこれが必要です。

また、Selenium と XPath をすばやく学習するための良い情報源があれば、それらも大歓迎です!

4

4 に答える 4

5

この仕様は驚くべきことに、XPath に関する非常に優れた読み物です。

CSS セレクターを試すこともできます。

とにかく、テーブルからデータを取得する1つの方法は次のとおりです。

// gets all rows
List<WebElement> rows = driver.findElements(By.xpath("//table[@class='SpecTable']//tr"));
// for every line, store both columns
for (WebElement row : rows) {
    WebElement key = row.findElement(By.XPath("./td[1]"));
    doAnythingWithText(key.getText());
    WebElement val = row.findElement(By.XPath("./td[2]"));
    doAnythingWithText(val.getText());
}
于 2012-04-25T21:43:47.997 に答える
2

おそらくこれはあなたのニーズに合うでしょう:

string text = driver.findElement(By.cssSelector("table.SpecTable")).getText();

文字列textには、クラス SpecTable を持つテーブルのすべてのテキスト ノードが含まれます。cssは IE でサポートされており、xpath よりも高速であるため、私はcssを使用することを好みます。ただし、xpath チュートリアルについては、これこれを試してください。

于 2012-04-25T21:37:19.250 に答える
0

別のオプションとして、テーブルのすべてのセルを1つの配列に取り込み、その方法でそれらにアクセスすることができます。例えば。

ReadOnlyCollection<IWebElement> Cells = driver.FindElements(By.XPath("//table[@class='SpecTable']//tr//td"));

これにより、そのテーブル内のすべてのセルが配列として取得され、テキストに繰り返しアクセスするために使用できます。

string forOutput = Cells[i].Text;
于 2012-04-25T23:28:45.200 に答える
-1

2 次元配列の任意のテーブルを抽出する CSharp メソッド:

private string[,] getYourSpecTable(){
    return getArrayBy(By.CssSelector("table.SpecTable tr"), By.CssSelector("td"));
}

private string[,] getArrayBy(By rowsBy, By columnsBy){
    bool init=false;
    int nbRow=0, nbCol=0;
    string[,] ret = null;
    ReadOnlyCollection<OpenQA.Selenium.IWebElement> rows = this.webDriver.FindElements(rowsBy);
    nbRow = rows.Count;
    for(int r=0;r<nbRow;r++) {
        ReadOnlyCollection<OpenQA.Selenium.IWebElement> cols = rows[r].FindElements(columnsBy);
        if(!init) {
            init= true;
            nbCol = cols.Count;
            ret = new string[rows.Count, cols.Count];
        }                
        for(int c=0;c<nbCol;c++) {
            ret[r, c] = cols[c].Text;
        }
    }
    return ret;
}
于 2012-07-17T01:03:54.030 に答える