这里有一点大脑冻结所以我希望得到一些指示,基本上我需要提取特定div标签的内容,是的我知道正则表达式通常不会被批准,但它是一个简单的网页在没有嵌套div的情况下抓取应用程序。
我正在尝试匹配这个:
<div class="entry">
<span class="title">Some company</span>
<span class="description">
<strong>Address: </strong>Some address
<br /><strong>Telephone: </strong> 01908 12345
</span>
</div>
简单的vb代码如下:
Dim myMatches As MatchCollection
Dim myRegex As New Regex("<div.*?class=""entry"".*?>.*</div>", RegexOptions.Singleline)
Dim wc As New WebClient
Dim html As String = wc.DownloadString("http://somewebaddress.com")
RichTextBox1.Text = html
myMatches = myRegex.Matches(html)
MsgBox(html)
'Search for all the words in a string
Dim successfulMatch As Match
For Each successfulMatch In myMatches
MsgBox(successfulMatch.Groups(1).ToString)
Next
非常感谢任何帮助。
答案 0 :(得分:7)
你的正则表达式适用于你的例子。不过应该做一些改进:
<div[^<>]*class="entry"[^<>]*>(?<content>.*?)</div>
[^<>]*
表示“匹配除尖括号之外的任意数量的字符”,确保我们不会意外地突破我们所处的标记。
.*?
(注意?
)表示“匹配任意数量的字符,但只能尽可能少”。这样可以避免匹配页面中的第一个<div class="entry">
标记。
但是你的正则表达式本身应该仍然匹配某些东西。也许你没有正确使用它?
我不知道Visual Basic,所以这只是在黑暗中拍摄,但RegexBuddy建议采用以下方法:
Dim RegexObj As New Regex("<div[^<>]*class=""entry""[^<>]*>(?<content>.*?)</div>")
Dim MatchResult As Match = RegexObj.Match(SubjectString)
While MatchResult.Success
ResultList.Add(MatchResult.Groups("content").Value)
MatchResult = MatchResult.NextMatch()
End While
我建议不要再使用正则表达式。如果你坚持,你最终会得到如下所示的怪物正则表达式,这只有在div
内容的形式永远不变的情况下才会起作用:
<div[^<>]*class="entry"[^<>]*>\s*
<span[^<>]*class="title"[^<>]*>\s*
(?<title>.*?)
\s*</span>\s*
<span[^<>]*class="description"[^<>]*>\s*
<strong>\s*Address:\s*</strong>\s*
(?<address>.*?)
\s*<strong>\s*Telephone:\s*</strong>\s*
(?<phone>.*?)
\s*</span>\s*</div>
或(看到VB.NET中多行字符串的乐趣):
Dim RegexObj As New Regex(
"<div[^<>]*class=""entry""[^<>]*>\s*" & chr(10) & _
"<span[^<>]*class=""title""[^<>]*>\s*" & chr(10) & _
"(?<title>.*?)" & chr(10) & _
"\s*</span>\s*" & chr(10) & _
"<span[^<>]*class=""description""[^<>]*>\s*" & chr(10) & _
"<strong>\s*Address:\s*</strong>\s*" & chr(10) & _
"(?<address>.*?)" & chr(10) & _
"\s*<strong>\s*Telephone:\s*</strong>\s*" & chr(10) & _
"(?<phone>.*?)" & chr(10) & _
"\s*</span>\s*</div>",
RegexOptions.Singleline Or RegexOptions.IgnorePatternWhitespace)
(当然,现在你需要存储MatchResult.Groups("title")
等的结果......)
答案 1 :(得分:2)
尝试使用 RegexOptions.Multiline
代替RegexOptions.Singleline
感谢@Tim指出上述内容不起作用......我的不好。
@Tim的答案很好,应该是接受的答案,但是阻止你的代码工作的额外部分是Group(1)
没有第二组返回。
更改...
MsgBox(successfulMatch.Groups(1).ToString)
要...
MsgBox(successfulMatch.Groups(0).ToString)
答案 2 :(得分:0)
使用这个
<div.*?class=""entry"".*?>(?<divBody>.*)</div>
并获取名为 divBody
的组但请注意,如果字符串包含其他节点 div (并且似乎无法通过正则表达式解决此问题),则此操作无效。对于您的解决方案 xslt 可能会有用。
答案 3 :(得分:0)