diff --git a/HandsomeSoup.cabal b/HandsomeSoup.cabal
--- a/HandsomeSoup.cabal
+++ b/HandsomeSoup.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.3.1
+Version:             0.3.2
 
 -- A short (one-line) description of the package.
 Synopsis:            Work with HTML more easily in HXT
@@ -51,7 +51,7 @@
   Exposed-modules:     Text.HandsomeSoup, Text.CSS.Parser
   
   -- Packages needed in order to build this package.
-  Build-depends: base < 5, transformers, HTTP, parsec, containers, mtl, MaybeT, hxt, network
+  Build-depends: base < 5, transformers, HTTP, parsec, containers, mtl, MaybeT, hxt, network, hxt-http
   
   -- Modules not exported by this package.
   Other-modules: Text.CSS.Utils
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -4,7 +4,7 @@
 
 HandsomeSoup is the library I wish I had when I started parsing HTML in Haskell.
 
-It is built on top of [HXT](http://www.fh-wedel.de/~si/HXmlToolbox/) and adds a few functions that make is easier to work with HTML.
+It is built on top of [HXT](http://www.fh-wedel.de/~si/HXmlToolbox/) and adds a few functions that make it easier to work with HTML.
 
 Most importantly, it adds CSS selectors to HXT. The goal of HandsomeSoup is to be a complete CSS2 selector parser for HXT.
 
diff --git a/Text/CSS/Parser.hs b/Text/CSS/Parser.hs
--- a/Text/CSS/Parser.hs
+++ b/Text/CSS/Parser.hs
@@ -3,6 +3,7 @@
 import Text.Parsec
 import qualified Data.Functor.Identity as I
 import Data.List
+import Data.Maybe
 import Text.CSS.Utils
 -- if no tag name was given, sName will be set to '*'
 -- attrs are (attr name, attr value).
@@ -27,11 +28,21 @@
 pp (Selector name attrs pseudo) = show name ++ ":" ++ showMap attrs ++ ", " ++ show pseudo
     where showMap m = ("{" ++ (foldl (\acc (k,v) -> acc ++ (show k) ++ ":" ++ (show v) ++ ", ") "" m)) ++ "}"
 
+{- Some lexeme parsers -}
+ident :: ParsecT [Char] u I.Identity String
+ident = do c1 <- optionMaybe (char '-')
+           c2 <- nmstart
+           cs <- many nmchar
+           return $ concat [maybeToList c1, [c2], cs]
+
+nmstart = alphaNum <|> char '_'
+nmchar  = alphaNum <|> oneOf "_-"
+
 {- TYPE SELECTORS FOLLOW -}
 
 -- | selects a tag name, like @ h1 @
 typeSelector :: ParsecT [Char] u I.Identity [Char]
-typeSelector = many1 alphaNum
+typeSelector = many1 (alphaNum <|> oneOf "_-")
 
 -- | universal selector, selects @ * @
 universalSelector :: ParsecT [Char] u I.Identity String
@@ -46,19 +57,19 @@
 -- | class selector, selects @ .foo @
 classSelector :: ParsecT [Char] u I.Identity ([Char], [Char])
 classSelector = do
-    val <- char '.' >> many1 alphaNum
+    val <- char '.' >> ident
     return ("class", '~':val)
 
 -- | id selector, selects @ #foo @
 idSelector :: ParsecT [Char] u I.Identity ([Char], [Char])
 idSelector = do
-    val <- char '#' >> many1 alphaNum
+    val <- char '#' >> many1 nmchar
     return ("id", val)
 
 -- | selects attributes, like @ [id] @ (element must have id) or @ [id=foo] @ (element must have id foo).
 attributeSelector :: ParsecT [Char] u I.Identity ([Char], [Char])
 attributeSelector = do
-      _contents <- between (char '[') (char ']') (many1 (alphaNum <|> oneOf "-_|~=\"'"))
+      _contents <- between (char '[') (char ']') (many1 (alphaNum <|> oneOf "/-_|~=\"'."))
       -- remove quotes
       let contents = filter (\c -> c /= '"' && c /= '\'') _contents
       if "~=" `isInfixOf` contents 
diff --git a/Text/HandsomeSoup.hs b/Text/HandsomeSoup.hs
--- a/Text/HandsomeSoup.hs
+++ b/Text/HandsomeSoup.hs
@@ -15,6 +15,8 @@
 import Data.List
 import Control.Monad
 import Text.CSS.Parser hiding (css)
+import Text.XML.HXT.Arrow.ReadDocument
+import Text.XML.HXT.HTTP
 
 -- | Helper function for getting page content. Example:
 --
@@ -26,11 +28,14 @@
 
 -- | Given a url, returns a document. Example:
 --
--- > doc <- fromUrl "http://foo.com"
-fromUrl :: String -> IO (IOSArrow XmlTree (NTree XNode))
-fromUrl url = do
-  contents <- runMaybeT $ openUrl url
-  return $ parseHtml (fromMaybe "" contents)
+-- > doc = fromUrl "http://foo.com"
+-- > doc = fromUrl "tests/test.html"
+fromUrl :: String -> IOSArrow XmlTree (NTree XNode)
+fromUrl url = readDocument [withValidate        no,
+                            withInputEncoding   isoLatin1,
+                            withParseByMimeType yes,
+                            withHTTP            [],
+                            withWarnings        no] url
 
 -- | Given a string, parses it and returns a document. Example:
 --
