【问题标题】:Web scraper replacing some characters with question marks网络爬虫用问号替换一些字符
【发布时间】:2024-05-04 15:10:04
【问题描述】:

我制作了一个简单的网络抓取工具,它为我抓取歌词,然后将其写入数据库。一切正常,但由于某种原因,它用问号替换了一些字符,当我在一个简单的 php 网页上查看此信息时,我发现歌词中有很多错误。

I?m = I'm
Let?s = Let's
haven?t = haven't
stuff like that.

我知道错误出在 c# 和我的代码中,因为我在它写入数据库之前放置了一个断点,并将它显示在富文本框中。我怎样才能让它正确显示这些字符?

        public static string getSourceCode(string url)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
            string sourceCode = sr.ReadToEnd();
            sr.Close();
            resp.Close();
            return sourceCode;
        }
........
string url = txbURL2.Text;

string sourceCode = sourceCode = WorkerClass.getSourceCode(url);
int startIndex = sourceCode.IndexOf("<td valign=\"top\" width=\"100%\">");
sourceCode = sourceCode.Substring(startIndex, sourceCode.Length - startIndex);
........
//Gets Lyric
startIndex = sourceCode.IndexOf("<br><b>Lyrics:</b><br><br>") + 30;
endIndex = sourceCode.IndexOf("     <br><br>", startIndex);
string lyric = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
rtbLyric.Text = lyric;
//End Lyric

【问题讨论】:

  • 请不要在标题前加上“C#”之类的前缀。这就是标签的用途。

标签: c# character-encoding screen-scraping web-scraping


【解决方案1】:

问题可能是字符编码。我的猜测是你正在抓取的网页是用 UTF8 编码的,但是你正在转换为 ASCII。

查看名为“What every developer should know about character encoding”的优秀文章了解更多详情。

更新

你可以试试这个,虽然 StreamReader 应该默认为 UTF-8:

var encoding = System.Text.Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader(resp.GetResponseStream(), encoding);  

【讨论】:

  • 有没有办法将其转换回 UTF8 或保持 UTF8?我对编程很陌生。所以,你们所说的一切,我都必须研究和学习。
  • 我认为问题不在于您发布的代码。 C# 通常默认使用 UTF8 编码。不过,请参阅我的更新以获取建议。
【解决方案2】:

通过在 html 代码中搜索字符集来检查编码。
您的代码片段错过了实际的加载过程,因此无法判断哪里出错了。

【讨论】:

  • 我添加了我相信你说我丢失的内容。
  • 我无法为字符集处理任何 信息。 html的默认值是什么?是 UTF8 吗?
  • 您的文档是哪个 HTML 版本?还要检查en.wikipedia.org/wiki/…
【解决方案3】:

您也可以尝试使用 WebClient:

WebClient client = new WebClient { Encoding = Encoding.UTF8 };
string html = client.DownloadString(url);

【讨论】:

    最近更新 更多