首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用C#在网页源代码的div中查找文本

如何使用C#在网页源代码的div中查找文本
EN

Stack Overflow用户
提问于 2013-05-20 11:37:47
回答 6查看 338K关注 0票数 96

如何使用LINQ表达式从网站获取、保存HTML代码并查找一些文本?

我正在使用以下代码来获取网页的源代码:

代码语言:javascript
复制
public static String code(string Url)
{
    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
    myRequest.Method = "GET";
    WebResponse myResponse = myRequest.GetResponse();
    StreamReader sr = new StreamReader(myResponse.GetResponseStream(),
        System.Text.Encoding.UTF8);
    string result = sr.ReadToEnd();
    sr.Close();
    myResponse.Close();
    
    return result;
}

如何在网页源代码的div中查找文本?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-20 11:47:13

从网站获取HTML代码。您可以使用如下代码:

代码语言:javascript
复制
string urlAddress = "http://google.com";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

if (response.StatusCode == HttpStatusCode.OK)
{
    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream = null;
    if (String.IsNullOrWhiteSpace(response.CharacterSet))
        readStream = new StreamReader(receiveStream);
    else
        readStream = new StreamReader(receiveStream,
            Encoding.GetEncoding(response.CharacterSet));
    string data = readStream.ReadToEnd();
    response.Close();
    readStream.Close();
}

这将为您提供从网站返回的HTML。但是通过LINQ查找文本并非易事。也许使用正则表达式更好,但这在HTML中效果不佳。

票数 117
EN

Stack Overflow用户

发布于 2013-05-20 12:38:30

最好使用Webclient类来简化您的任务:

代码语言:javascript
复制
using System.Net;

using (WebClient client = new WebClient())
{
    string htmlCode = client.DownloadString("http://somesite.com/default.html");
}
票数 186
EN

Stack Overflow用户

发布于 2013-05-20 12:14:01

最好的选择是HTMLAgilityPack。您还可以根据需要使用FizzlerCSQuery从检索到的页面中选择元素。使用LINQ或Regukar表达式很容易出错,特别是当HTML可能格式不正确、缺少结束标记、有嵌套的子元素等时。

您需要将页面流式传输到HtmlDocument对象中,然后选择所需的元素。

代码语言:javascript
复制
// Call the page and get the generated HTML
var doc = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNode.ElementsFlags["br"] = HtmlAgilityPack.HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;

try
{
    var webRequest = HttpWebRequest.Create(pageUrl);
    Stream stream = webRequest.GetResponse().GetResponseStream();
    doc.Load(stream);
    stream.Close();
}
catch (System.UriFormatException uex)
{
    Log.Fatal("There was an error in the format of the url: " + itemUrl, uex);
    throw;
}
catch (System.Net.WebException wex)
{
    Log.Fatal("There was an error connecting to the url: " + itemUrl, wex);
    throw;
}

//get the div by id and then get the inner text 
string testDivSelector = "//div[@id='test']";
var divString = doc.DocumentNode.SelectSingleNode(testDivSelector).InnerHtml.ToString();

实际上,编辑,删除它。最简单的方法是使用FizzlerEx,这是原始Fizzler项目的更新后的jQuery/CSS3-selectors实现。

直接从他们的站点获取代码示例:

代码语言:javascript
复制
using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;

//get the page
var web = new HtmlWeb();
var document = web.Load("http://example.com/page.html");
var page = document.DocumentNode;

//loop through all div tags with item css class
foreach(var item in page.QuerySelectorAll("div.item"))
{
    var title = item.QuerySelector("h3:not(.share)").InnerText;
    var date = DateTime.Parse(item.QuerySelector("span:eq(2)").InnerText);
    var description = item.QuerySelector("span:has(b)").InnerHtml;
}

我认为没有比这更简单的了。

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16642196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档