【问题标题】:Can't fetch strings started with a customized keyword无法获取以自定义关键字开头的字符串
【发布时间】:2018-06-17 12:00:24
【问题描述】:

我正在尝试在维基百科页面中获取以关键字 WarLPGA 开头的字符串。我没有直接使用这两个关键字;相反,我通过keyword 变量使用它们,因为qsp 中可能包含更多项目。

但是,当我使用 Like 运算符运行脚本时,我什么也得不到。也没有错误。当我使用If InStr(post.innerText, keyword) > 0 Then 这个代码块运行相同的结果时,我得到了结果。问题是当我使用InStr() 函数运行我的脚本时,它会获取那些包含keyword 我用作变量的字符串,而不是以keyword 开头的字符串。

那么,如何在下面的脚本中使用Like 运算符来实现相同的效果。

这是我目前的尝试:

Sub FetchInfo()
    Const URL As String = "https://en.wikipedia.org/wiki/Portal:Current_events"
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim post As Object, qsp As Variant, keyword As Variant, R&

    qsp = [{"War in Donbass","LPGA Tour"}]

    For Each keyword In qsp
        keyword = Split(keyword, " ")(0)
        With Http
            .Open "GET", URL, False
            .send
            Html.body.innerHTML = .responseText
        End With

        For Each post In Html.getElementsByTagName("a")
            If post.innerText Like "*keyword" Then
                R = R + 1: Cells(R, 1) = post.innerText
            End If
        Next post
    Next keyword
End Sub

当我使用 InStr() 函数时,该部分看起来像:

If InStr(post.innerText, keyword) > 0 Then
    R = R + 1: Cells(R, 1) = post.innerText
End If

更清楚一点:如果我想搜索War,那么我想得到类似的结果(以下结果是假设的,它们可能不存在于该站点中):

war house
war of the worlds

不喜欢:

city of war
causes of the war

【问题讨论】:

  • 所以您想要字符串开头与搜索词匹配的结果?目前,如果您尝试匹配 "*keyword",您的代码显然无法正常工作
  • 是的,就是这样。
  • 或许可以试试:If post.innerText Like keyword & "*" Then
  • 没办法!!!!!!你做到了。你让我很开心@ashleedawg。请将其作为答案包含在内,以便我接受。
  • 顺便说一下,关于为什么它应该是"*" 而不是"* "" *" 的一些信息会很有帮助。

标签: string vba excel web-scraping


【解决方案1】:

我知道您喜欢针对您的问题陈述非常具体的答案....但是我很感兴趣是否可以使用 Selenium 来做到这一点。因此,我使用“War”运行以下命令,看看是否可以匹配以“War”开头的a 标签的字符串。显然,这可以根据您的原始示例进行扩展,但它与一般任务匹配吗?

旁注:我猜您可以在 .innerText 上使用 Split 并在您的示例中测试 LBound。


XPath

我使用XPathstarts-with 来检索字符串。

在页面上使用了 XPath 查询:https://en.wikipedia.org/wiki/War_correspondent


代码输出:


它与以 war 结尾的项目不匹配(Selenium basic 似乎不允许//a[ends-with(.,'War')],但如果您使用 XPath 测试器,那么那些检索到的项目将是(结果的小样本):


VBA:

Option Explicit
Public Sub GetInfo()
    Dim d As WebDriver, Html As HTMLDocument
    Set d = New ChromeDriver
    Const URL = "https://en.wikipedia.org/wiki/War_correspondent"
    With d
        .Start "Chrome"
        .get URL
        Set Html = New HTMLDocument
        Html.body.innerHTML = .FindElementByXPath("//body").Attribute("innerHTML")
        Dim matchedStrings As Object, currentMatch As Long
        Set matchedStrings = .FindElementsByXPath("//a[starts-with(.,'War')]")
        If matchedStrings Is Nothing Then
            Debug.Print "No matches found"
            Exit Sub
        End If
        For currentMatch = 1 To matchedStrings.Count
            Debug.Print matchedStrings(currentMatch).Text
        Next currentMatch
        .Quit
    End With
End Sub

【讨论】:

  • 你永远不会不惊奇。它工作得非常完美。我创建这篇文章是为了了解 like 运算符的工作原理。 ashleedawg 帮助我了解了这一点,您想出了一种不同的方法来满足相同的要求,这也很有帮助。
  • 很高兴。我很担心,因为我知道你总是有一个特定的目标,但你的问题很有趣,让我思考我可以尝试的其他事情。现在我知道如何用硒来做到这一点:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2021-11-18
  • 2016-05-18
  • 2023-03-26
  • 2020-05-11
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多