私は比較的新しいpythonです。学習するために、私はウィキペディアにオンラインで行くプログラムを書いて、ランダムの概要セクションの最初のリンクを見つけましたそれがループに入るか、または哲学ページ(詳細はhere)を見つけて、指定された回数だけ新しいランダム記事のためにこのプロセスを繰り返すまで、そのリンクをたどり続けます。私は有用なデータ構造の形で結果を集めて、Rpy libraryを使ってRにデータを渡すことができるように、ネットワークダイアグラムを描画することができますノードは訪問されたページを表す図内のノードと、出発記事から哲学ページに至る経路とを示している。ウィキペディアの哲学のゲームダイアグラム、パイソンとR
だから、私はpythonでかなり構造化されたhtmlをwikiから返すことに問題はありませんが、私が分かりづらい問題がいくつかあります。これまでは、lxmlライブラリのcssselectorを使って最初のリンクを選択しました。それは、このようなクラス=「MW-コンテンツ-LTR」とdivタグの直接の子孫である、APタグの直接の子孫である(タグにおいて)最初のリンクのための選択:
user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)'
values = {'name' : 'David Kavanagh',
'location' : 'Belfast',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
encodes = urllib.urlencode(values)
req = urllib2.Request(url, encodes, headers)
page = urllib2.urlopen(req)
root = parse(page).getroot()
return root.cssselect("div.mw-content-ltr>p>a")[0].get('href')
このコードは、ページ内の最初のリンクを見つけるために使用する関数内にあります。それはほとんどの部分で動作しますが、最初のリンクが他のタグの中にある場合、問題は、pタグの直接的な子孫ではなく、bタグなどと言います。上記のwikiの記事からわかるように、イタリック体またはカッコ内のリンクはゲームに適格ではありません。つまり、イタリック体のリンクは得られませんが、括弧内のリンクが頻繁に得られます。椅子の記事の最初のリンクのようなページの最初のリンクが表示されない場合がありますが、太字で表示されています。私は直系の子孫規定を削除しようとしましたが、概要セクションの上にあるリンク、通常はサイドボックス、pタグ、表の概要セクションと同じdivにあるリンクを頻繁に取得します。
だから私の質問の最初の部分は次のとおりです。
にはどうすればカッコ内のか、イタリック体ではなく、概要セクションの最初のリンクを選択するためにcssselectorsまたはいくつかの他の関数やライブラリを使用することができます。私は正規表現を使って生のhtmlを調べることを考えましたが、それは非常に厄介な解決策のように思えます。私は思っていないより少し良いものがあるかもしれないと思っていました。
現在、私は結果をリストのリストに保存しています。だから私は、wikiの記事のタイトルを含む文字列を含むリストがある、パスと呼ばれるリストがあります。
質問の2番目の部分は次のとおりです。 複数の収束パスを表すためにこのリストのリストをトラバースするにはどうすればよいですか?このような結果を保存するのは良い考えですか?終わりの図は逆さまの木のように見えるはずなので、私はいくつかの種類のツリーを作ることを考えましたが、それは概念的に、かなり単純なもののための多くの仕事のようです。
ご意見やご提案をいただければ幸いです。
乾杯、
デイビー
2つの異なる質問を1つに投稿しないでください! – taleinat
美しいスープはHTMLをよりよく解析できます(IMO)。 BSオブジェクトには、ネストされたタグやタグの属性(HTMLタグの意味)を返す属性(オブジェクト指向の意味)があります。シンチでなければならない。 **これまでにHTMLを解析するために正規表現を使用しないでくださいhttp://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – aitchnyu