回答 WebBrowser如何查找WFD-ID

加入
2020年8月24日
消息
1
编程经验
1-3
亲爱的社区,我需要你的帮助,
im Strugglin现在有权在WFD-ID上找到HTML源中的一个元素,以从那里复制空白文本。
在附件中,你找到了HTML代码。也许你之一有解决方案:'(
IE11加载WFD-ID我可以轻松磨损,但它不做。

Example:
            if (WebBrowser.ReadyState == WebBrowserReadyState.Complete)
            {
                foreach (HtmlElement Element in WebBrowser.Document.GetElementsByTagName("span"))
                {
                    if (Element.GetAttribute("wfd-id") == "136")
                    {
                        WebBrowser.Document.ExecCommand("Copy", false, null);
                        label1.Text = Clipboard.GetText();
                    }
                }
            }
 

附件

  • text-c2p.png.
    text-c2p.png.
    4.4 KB · Views: 10
  • 更多.png.
    更多.png.
    27.3 KB · Views: 10
Last edited:

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
欢迎来到论坛。

我可以问你为什么要刮掉数据吗?
是网站不可用的API吗?
如果是您的网站,为什么不为API调用编写API?

你接近实现这一点。多年来我必须已经一千次回答了这个问题。令人震惊的人仍然是用这个控件刮掉网站,而不是依赖或调用API。

你正在寻找的是GetElementById: htmldocument.getElementById(String)方法(System.Windows.Forms)
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,158
地点
挪威
编程经验
10+
你需要做的就是得到 Element.InnerText
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,158
地点
挪威
编程经验
10+

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
应该能够使用wfd-id作为id。我没试过。自从我用WBC抓住以来,很长一段时间。

也可以使用getElementByTagname在进行中。但如果存在许多相同的标签,则需要额外的过滤。

@crashedcrash. 您可以提供源页面的URI,以便我可以尝试吗?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,878
地点
切萨皮克,va.
编程经验
10+
还有HTML敏捷包 HTML敏捷包 这可能会让这一点更容易。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
应该能够使用wfd-id作为id。我没试过。自从我用WBC抓住以来,很长一段时间。
Well that was a silly suggestion. I wasn't sure if get element by id was strict on actually wanting an actual ID="myid". Anyway...
假设唤醒HTML是:
C#:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <span>I like TextB</span>
    <table border="0">
        <tr>
            <td>
                <span data-toggle="tooltip" data-placement="top" title="Click To Copy" wfd-id="130">TextA</span>
            </td>
        </tr>
        <tr>
            <td>
                <span data-toggle="tooltip" data-placement="top" title="Click To Copy" wfd-id="135">TextB</span>
            </td>
        </tr>
        <tr>
            <td>
                <span data-toggle="tooltip" data-placement="top" title="Click To Copy" wfd-id="135">TextB</span>
            </td>
        </tr>
    </table>
</body>
</html>
和一些示例C#代码:
C#:
            HtmlElementCollection htmlElementCollection = webBrowser1.Document.GetElementsByTagName("span");
            if (htmlElementCollection != null)
            {
                foreach (HtmlElement obj in htmlElementCollection)
                {
                    if (obj.InnerText.Contains("TextB"))
                    {

                    }
                }
            }
如果在页面上的一部分多次列出相同的短语,则只检查内部文本并不是非常有用的。因此,如果是这种情况,您将最终满足您的条件逻辑的多个条目。所以我可以理解为什么人们喜欢通过标签或id获得特定元素而不是读内文文本。

This is why its important to have the correct html code, and if the html of the website you are scraping is your own, you really should add an actual ID="myid" to your source code as already suggested; then you can get the element by ID, as I've shown above.

但是如果您无法访问HTML源代码以更改它,该呢?然后你需要通过替代路线,就像你一样。此示例将执行您所需要的:
C#:
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            string match = IsAMatch();
            if (match != null)
            {
                /* Do something with value */
            }
        }

        private string IsAMatch()
        {
            foreach (HtmlElement html_Obj in webBrowser1.Document.GetElementsByTagName("span"))
            {
                if (html_Obj.GetAttribute("wfd-id").Contains("135"))
                {
                    return html_Obj.InnerText;
                }
            }
            return null;
        }

如果您想去obj.outerhtml的手动加密路由,它将给您提供: "<SPAN title=\"Click To Copy\" wfd-id=\"135\" data-placement=\"top\" data-toggle=\"tooltip\">TextB</SPAN>"

First check the outerHtml contains wfd-id=\"135\", then you can use substring, skip, indexof to cut the outer html off at the closing span tag. Then using indexof >. Then substring with indexof for the first index of < using skip on the first opening bracket of < which will give you your text value.

如果使用SkyDiver链接的HTML敏捷包类似的东西,这显然更容易。
 
最佳 底部