所以我正在进行概念证明冒险,我想尝试做的是循环浏览html并找到所有链接并使用C#保存mysql中的链接。找到链接部分工作正常,但当我去保存表中的链接时,它们将逐步复制。以下示例
表中的记录: 1:1 1:2 1:2 1:3 1:3 1:3 1:4 1:4 1:4 1:4 等...
页面表:
| page_id | page_url | date_added |
------------------------------------------
| 1 | "http://bla.com | |
链接表:
| link_id | link_page_id | date_added |
---------------------------------------
获取链接的代码:
private static void getLinks(string contents, string url)
{
HtmlDocument html = new HtmlDocument();
html.LoadHtml(contents);
HtmlNodeCollection links = html.DocumentNode.SelectNodes("//a[@href]");
foreach(HtmlNode link in links)
{
foreach(HtmlAttribute attr in link.Attributes)
{
if(attr.Name == "href")
{
saveLinks(url, attr.Value);
}
}
}
}
保存链接的代码:
private static void saveLinks(string url, string link)
{
try
{
Console.WriteLine(url + " - " + link);
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = @"INSERT INTO
sites.links(
links_page_id,
link
)
SELECT
p.page_id,
@link
FROM
sites.links l
RIGHT JOIN
sites.pages p
ON p.page_url = @url";
cmd.Prepare();
cmd.Parameters.AddWithValue("@url", url);
cmd.Parameters.AddWithValue("@link", link);
cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
Console.WriteLine("Failure: " + e.Message);
}
}
在我的控制台输出中我获得了没有重复项的预期链接数,我已经在mysql中测试了查询,一切看起来都不错。它可能是一些愚蠢的东西,我可以忽略,但我似乎无法找到我做错了什么。所以任何帮助都会很棒。
答案 0 :(得分:1)
如果您需要通过其网址获取page_id
,则无需加入sites.links
cmd.CommandText = @"INSERT INTO
sites.links(
links_page_id,
link
)
SELECT
p.page_id,
@link
FROM
sites.pages p
WHERE p.page_url = @url";
答案 1 :(得分:0)
你的格式很奇怪......这就是我以前所说的:
SELECT p.page_id, @link
FROM sites.links l
RIGHT JOIN sites.pages p ON p.page_url = @url";
所以这里所有的事情都没有意义。您从(sites.links)中选择的表格不会在查询中的任何位置使用,这也意味着它不会在RIGHT JOIN中使用,这意味着这不是右连接而是交叉连接。
你究竟想做什么,我很失落。
也许如果你展示了你得到的输入以及你期望的输出可能会有所帮助。