2017-09-17 19 views
0

私はPythonで新しく、私の質問が非常に基本的であれば申し訳ありません。私のプログラムでは、htmlのWebページを解析し、その中のすべてのリンクを抽出する必要があります。BeautifulSoupまたはurlibライブラリを使用せずにHTML Webコンテンツ内のURLを抽出して抽出します

<html><head><title>Fakebook</title><style TYPE="text/css"><!-- 
#pagelist li { display: inline; padding-right: 10px; } 
--></style></head><body><h1>testwebapp</h1><p><a href="/testwebapp/">Home</a></p><hr/><h1>Welcome to testwebapp</h1><p>Random URLs!</p><ul><li><a href="/testwebapp/847945358/">Rennie Tach</a></li><li><a href="/testwebapp/848854776/">Pid Ko</a></li><li><a href="/testwebapp/850558104/">Ler She</a></li><li><a href="/testwebapp/851635068/">iti Sar</a></li><li><a </ul> 
<p>Page 1 of 2 
<ul id="pagelist"><li> 
1 

</li><li><a href="/testwebapp/570508160/fri/2/">2</a></li><li><a href="/testwebapp/570508160/fri/2/">next</a></li><li><a href="/testwebapp/570508160/fri/2/">last</a></li></ul></p> 
</body></html> 

は今、私はPARSにこのWebコンテンツを必要とし、その内部のすべてのリンクを抽出します。私のWebページのコンテンツは、以下のようなものであると仮定します。別の言い方をすれば、私は、Webページから抽出されるコンテンツを下回る必要があります:私はpythonのようなthisthisまたはthisを使用して、Webページを解析についてたくさん検索

/testwebapp/847945358/ 
/testwebapp/848854776/ 
/testwebapp/850558104/ 
/testwebapp/851635068/ 
/testwebapp/570508160/fri/2/ 
/testwebapp/570508160/fri/2/ 
/testwebapp/570508160/fri/2/ 

、それらの多くは、次のようなライブラリを使用していましたurlibまたはurlib2またはBeautifulSoupを使用して、これらのライブラリを自分のプログラムで使用できないことを要求します。私のアプリケーションは、これらのライブラリがインストールされていないマシン上で動作するためです。だから私は手動で私のWebコンテンツを解析する必要があります。私の考えは、ウェブページの内容を文字列に保存してから、文字列を(文字列で区切った)文字列に変換して配列の各項目をチェックし、/testwebapp/またはfriというキーワードがある場合は、それは配列内にあります。私は、文字列を変換するためのコマンドの下に使用しています配列に私のWebページコンテンツが含まれている場合でも、私はこのエラーました:

arrayofwords_fromwebpage = (webcontent_saved_in_a_string).split(" ") 

を、エラーは次のとおりです。

TypeError: a bytes-like object is required, not 'str' 

は、任意の迅速かつ効率的にありurlib、urlib2、BeautifulSoupなどのライブラリを使用せずにHTML Webページ内でこのリンクを解析して抽出する方法はありますか?

答えて

0

あなたが必要とするすべては、すべてのURLの使用のみのPythonを発見したのであれば、この機能はあなたを助ける:

def search(html): 
    HREF = 'a href="' 
    res = [] 
    s, e = 0, 0 
    while True: 
     s = html.find(HREF, e) 
     if s == -1: 
      break 
     e = html.find('">', s) 
     res.append(html[s+len(HREF):e]) 

    return res 
+0

これは完璧です@ AndMar.tnx –

0

あなたが標準ライブラリ、すなわちHTMLParserから何かを使用することができます。

私はあなたの目的のために 'a'タグを見てそれをサブクラス化します。パーサーは、パーサーに出会うと、 'href'属性を探し、存在すればその値を出力します。

これを実行するには、サブクラスをインスタンス化し、そのfeedメソッドに質問に表示されたHTMLを渡します。

この回答の最後に結果が表示されます。

>>> from html.parser import HTMLParser 
>>> class SharoozHTMLParser(HTMLParser): 
...  def handle_starttag(self, tag, attrs): 
...   if tag == 'a': 
...    attrs = {k: v for (k, v) in attrs} 
...    if 'href' in attrs: 
...     print (attrs['href']) 
...     
>>> parser = SharoozHTMLParser() 
>>> parser.feed(open('temp.htm').read()) 
/testwebapp/ 
/testwebapp/847945358/ 
/testwebapp/848854776/ 
/testwebapp/850558104/ 
/testwebapp/851635068/ 
/testwebapp/570508160/fri/2/ 
/testwebapp/570508160/fri/2/ 
/testwebapp/570508160/fri/2/ 
+0

ありがとうございます@Billベル、それは私が間違いなく動作します、私はそれを使用します。 –

+0

大歓迎です。あなたは私に賛成し、それが「受け入れられた」と印を付けますか? –

+0

申し訳ありませんが、私はそれを取り戻す。既に別の回答を受け入れていることに気付かなかった。 –

関連する問題