Skip to content

Instantly share code, notes, and snippets.

@mikeobrien
Created August 15, 2015 16:11
Show Gist options
  • Save mikeobrien/fd15a184e048b5f07598 to your computer and use it in GitHub Desktop.
Save mikeobrien/fd15a184e048b5f07598 to your computer and use it in GitHub Desktop.
USPTO Search
public static class StringExtensions
{
public static string StripHtml(this string value)
{
return Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim();
}
}
public class Trademark
{
public string SerialNumber { get; set; }
public string RegistrationNumber { get; set; }
public string WordMark { get; set; }
public string Status { get; set; }
public string Url { get; set; }
}
public interface ITrademarkSearch
{
List<Trademark> Search(string query);
}
public class TrademarkSearch : ITrademarkSearch
{
private const string ResultsRegex =
@"(<TR>\s*?" +
@"<TD>\d.*<\/TD>\s*?" +
@"<TD>\s*?<a.*?>(.*?)<\/a>\s*?<\/TD>\s*?" +
@"<TD>\s*?<a.*?>(.*?)<\/a>\s*?<\/TD>\s*?" +
@"<TD>\s*?<a.*?>(.*?)<\/a>\s*?<\/TD>\s*?" +
@"<TD>\s*?<a HREF=""(.*?)"">.*?<\/a>\s*?<\/TD>\s*?" +
@"<TD>\s*?<a.*?>(.*?)<\/a>\s*?<\/TD>(.|\s)*?" +
@"<\/TR>).*";
public List<Trademark> Search(string query)
{
// TODO: Add caching
using (var client = new WebClient())
{
var response = Encoding.UTF8.GetString(client
.UploadData("http://tmsearch.uspto.gov/bin/gate.exe ",
Encoding.UTF8.GetBytes("f=toc&p_lang=english&p_d=trmk&p_L=500" +
$"&p_plural=yes&p_s_ALL={query}&a_search=Submit Query")));
var results = new Regex(ResultsRegex, RegexOptions.IgnoreCase |
RegexOptions.Multiline).Matches(response);
return results.Cast<Match>().Select(x => new Trademark
{
SerialNumber = x.Groups[2].Value.StripHtml(),
RegistrationNumber = x.Groups[3].Value.StripHtml(),
WordMark = x.Groups[4].Value.StripHtml(),
Url = x.Groups[5].Value,
Status = x.Groups[6].Value.StripHtml()
}).ToList();
}
}
}
[TestFixture]
public class TrademarkSearchTests
{
[Test]
public void Should_return_search_results()
{
var results = new TrademarkSearch().Search("(fark)[COMB]");
results.Count.ShouldBeGreaterThanOrEqualTo(8);
var result = results.FirstOrDefault(x => x.SerialNumber == "77326033");
result.ShouldNotBeNull();
result.RegistrationNumber.ShouldEqual("3501114");
result.WordMark.ShouldEqual("IT'S NOT NEWS, IT'S FARK.COM");
result.Status.ShouldEqual("LIVE");
result.Url.ShouldEqual("http://tsdr.uspto.gov/#caseNumber=77326033" +
"&caseType=SERIAL_NO&searchType=statusSearch");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment