【问题标题】:Get string data Xpath获取字符串数据 Xpath
【发布时间】:2018-09-03 07:51:32
【问题描述】:

我需要帮助才能从网站获取数据。我在我的应用程序中使用 geckofx。我希望它在加载页面后从 xpath 位置检索文本数据

XPathResult xpathResult = geckoWebBrowser1.Document.EvaluateXPath("/html/body/table[3]/tbody/tr[1]/td[2]/a[1]");
IEnumerable<GeckoNode> foundNodes = xpathResult.GetNodes();

如何将数据下载为文本?

【问题讨论】:

  • 你想要元素内部还是外部 HTML?您是否尝试过任何代码?你想将它下载到某个位置还是只是为了在你的代码中使用输出?
  • 这是一个外部网站。我想稍后保存这个位置的文本,例如在 excel 中
  • 我真的不知道您的问题是在获取正确的节点还是将其保存到文件中,或者您是否需要内部或外部 HTML 元素。尝试提供更多信息,您可能会有更好的机会得到答案。您发布的代码是否正确?你有任何错误输出吗?预期的结果是什么?你有没有尝试过别的?
  • foundNodes 不是字符串值。我不知道如何转换它。也许您知道获取此数据的另一种方法?

标签: c# xpath get gecko geckofx


【解决方案1】:

您似乎正在努力从 GeckoFX 对象中检索文本。
以下是一些可以帮助您入门的调用和操作:

//get by XPath
XPathResult xpathResult = _browser.Document.EvaluateXPath("//*[@id]/div/p[2]");
var foundNodes = xpathResult.GetNodes();
foreach (var node in foundNodes)
{
    var x = node.TextContent; // get text text contained by this node (including children)
    GeckoHtmlElement element = node as GeckoHtmlElement; //cast to access.. inner/outerHtml
    string inner = element.InnerHtml;
    string outer = element.OuterHtml;
    //iterate child nodes
    foreach (var child in node.ChildNodes)
    {

    }
}
//get by id
GeckoHtmlElement htmlElementById = _browser.Document.GetHtmlElementById("mw-content-text");
//get by tag
GeckoElementCollection byTag = _browser.Document.GetElementsByTagName("input");
foreach (var ele in byTag)
{
    var y = ele.GetAttribute("value");

}
//get by class
var byClass = _browser.Document.GetElementsByClassName("input");
foreach (var node in byClass)
{
    //...
}

//cast to a different object
var username = ((GeckoInputElement)_browser.Document.GetHtmlElementById("yourUsername")).Value;
//create new object from DomObject
var button = new GeckoButtonElement(_browser.Document.GetElementById("myBtn").DomObject);

【讨论】:

  • 谢谢!!!就是这样!我已经开始使用有很多混乱的 WebAutomation 代码。您的代码更短,并且可以正常工作。谢谢你的帮助:)
  • 我还有一个问题。我想从脚本中提取“code”变量的值,怎么做? xpath /html/body/table[3]/tbody/tr[1]/td[2]/script function test { // // { // var code = "f6738a09443b6a54b26cd6f4c7f2c4a9"; // } }
  • @DonCorleone AFAIK 你不能查询像 HTML 这样的脚本标签的内容。但是,您可以提取脚本标签的文本并使用正则表达式或类似的方法搜索 JavaScript 代码,例如stackoverflow.com/questions/31718783/… 但这是另一个问题..
【解决方案2】:
public string extract(string xpath, string type)
    {
        string result = string.Empty;
        GeckoHtmlElement elm = null;

        GeckoWebBrowser wb = geckoWebBrowser1;//(GeckoWebBrowser)GetCurrentWB();
        if (wb != null)
        {
            elm = GetElement(wb, xpath);
            if (elm != null)
                //UpdateUrlAbsolute(wb.Document, elm);

            if (elm != null)
            {
                switch (type)
                {
                    case "html":
                        result = elm.OuterHtml;
                        break;
                    case "text":
                        if (elm.GetType().Name == "GeckoTextAreaElement")
                        {
                            result = ((GeckoTextAreaElement)elm).Value;
                        }
                        else
                        {
                            result = elm.TextContent.Trim();
                        }
                        break;
                    case "value":
                        result = ((GeckoInputElement)elm).Value;
                        break;
                    default:
                        result = extractData(elm, type);
                        break;
                }
            }
        }

        return result;
    }
    private string extractData(GeckoHtmlElement ele, string attribute)
    {
        var result = string.Empty;

        if (ele != null)
        {
            var tmp = ele.GetAttribute(attribute);
            /*if (tmp == null)
            {
                tmp = extractData(ele.Parent, attribute);
            }*/
            if (tmp != null)
                result = tmp.Trim();
        }

        return result;
    }
    private object GetCurrentWB()
    {
        if (tabControl1.SelectedTab != null)
        {
            if(tabControl1.SelectedTab.Controls.Count > 0)
            //if (tabControl1.SelectedTab.Controls.Count > 0)
            {
                Control ctr = tabControl1.SelectedTab.Controls[0];

                if (ctr != null)
                {

                    return ctr as object;
                }
            }
        }
        return null;
    }
    private GeckoHtmlElement GetElement(GeckoWebBrowser wb, string xpath)
    {
        GeckoHtmlElement elm = null;
        if (xpath.StartsWith("/"))
        {
            if (xpath.Contains("@class") || xpath.Contains("@data-type"))
            {
                var html = GetHtmlFromGeckoDocument(wb.Document);
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(html);

                var node = doc.DocumentNode.SelectSingleNode(xpath);
                if (node != null)
                {
                    var currentXpath = "/" + node.XPath;
                    elm = (GeckoHtmlElement)wb.Document.EvaluateXPath(currentXpath).GetNodes().FirstOrDefault();
                }
            }
            else
            {
                elm = (GeckoHtmlElement)wb.Document.EvaluateXPath(xpath).GetNodes().FirstOrDefault();
            }
        }
        else
        {
            elm = (GeckoHtmlElement)wb.Document.GetElementById(xpath);
        }
        return elm;
    }
    private string GetHtmlFromGeckoDocument(GeckoDocument doc)
    {
        var result = string.Empty;

        GeckoHtmlElement element = null;
        var geckoDomElement = doc.DocumentElement;
        if (geckoDomElement is GeckoHtmlElement)
        {
            element = (GeckoHtmlElement)geckoDomElement;
            result = element.InnerHtml;
        }

        return result;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        var text = extract("/html/body/table[3]/tbody/tr[1]/td[2]/a[2]", "text");
        MessageBox.Show(text);
    }

我还插入了我使用更长代码的代码,但它也可以工作。也许有人会需要它。代码的创建者是 Đinh Công Thắng,Web 自动化应用程序, 问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2011-11-04
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多