python八爬虫フレーム
5628 ワード
爬虫類のフレーム BeautifulSoup 機能BeautifulSoupは、HTMLまたはXMLからデータを抽出するためのPythonライブラリです. 導入 使用方法:from bs 4 import BeautifulSoup soup=BeautifulSoup(html) オブジェクトの種類には、Tag,NavigablesString,BeautifulSoup,Commentの4種類があります.BeautifulSoupはドキュメントをツリー構造に変換し、各ノードは上記の4種類のPythonオブジェクトです. Tagは、XMLおよびHTMLのTagオブジェクトと同じです.例: Name tag.nameは取得可能、 は変更可能
Attributeの1つのTagオブジェクトには複数の属性がある、操作方法は辞書と同様である、前述のTagオブジェクトbのように1つのclass属性がある: などのvalueのlistが返されます.
変換がXMLドキュメントの場合、多値属性は存在せず、文字列が返されます.リストまたは文字列を使用して、属性に値を割り当てることができます. NavigablesString Tagの文字列は、NavigablesStringオブジェクトです.tag.string BeautifulSoup以外でこのタイプを使用する場合、Unicode:unicode(Tag.string)tagに含まれる文字列は編集不可、置換のみ:tag.string.replace_with(new string)tagは他のtagまたは文字列を含むことができ、NavigablesStringは他のオブジェクトを含むことができない.サポートされていません.content,.string,find()は、ドキュメントツリーの部分的な遍歴とドキュメントツリーの属性の検索のみをサポートします. BeautifulSoupは、1つのドキュメントのすべての内容を表しています.ほとんどの場合、Tagオブジェクトとして使用でき、ドキュメントツリーの遍歴とドキュメントツリーの検索のほとんどのプロパティをサポートします.HTMLやXMLではBeautifulSoupというTagはありませんので、nameやattribute属性はありませんが、 という特殊な属性があります. Comment CommentタイプはNavigablesStringタイプのサブクラスであり、BeautifulSoupにも同様の理由で他のタイプがある.
使用前に判断したほうがいいです.判断コードは以下の通りです.ドキュメントツリーBeautifulSoupオブジェクトを1つのツリーとして巡回し、複数のノードがあります.ノードの場合、その位置に対して子ノード、親ノード、兄弟ノードがあります. サブノードの1つのTagは、このTagのサブノードである複数のTagおよび文字列を含むことができる.NavigablesStringにはサブノードはありません.あるTagを得るためには、上述の方法:soup.tag_nameは点取属性により、現在の名前の最初のtagしか取得できないが、すべてを取得するには、ドキュメントツリーを検索する方法: 親ノード現在のノードの親ノード:.parent現在のノードのすべての親ノード:.parents 兄弟ノードは同じ親ノードを持つノード間である.next_sibling .previous_Sibling同理,すべての兄弟ノード:.next_siblings .previous_Siblingsは次の解析オブジェクトまたは前の解析オブジェクトを指す:階層を区別しない.next_element .previous_element .next_elements .previous_elements ドキュメントツリーでよく使用される2つの方法:
以上、フィルタには、純粋な文字列、正規表現、リスト、True、メソッドのいくつかが含まれます. find_all(name,attrs,recursive,text,kwargs)このメソッドは、現在のノードのすべてのtagサブノードを検索します.**
tagのnameプロパティを指し、文字列オブジェクトが自動的に無視されます.フィルタはすべての種類を使用できます.-keywordパラメータ:1つのパラメータが名前を指定しているが、上記のパラメータ名ではない場合、検索時にそのパラメータをtagの属性として検索します.たとえば、
class_メソッドは、すべてのフィルタを使用できます.またclassは多値属性であるため,1つの値をマッチングするだけで結果が得られる,いわゆる不完全マッチングである.完全一致を使用する場合、フィルタ内の文字の順序は実際と一致する必要があります.-textパラメータ:Tagの文字列の内容を検索し、すべてのフィルタを使用できます.-limitパラメータ:戻り数を制限します.-recursiveパラメータ:find_all()のデフォルトは、現在のノードのすべての子孫ノードを検索し、直接のサブノードのみを検索する場合は
等価の簡略化版があります
soup.find('head').find('title') soup.head.title
soup = BeautifulSoup(Extremely bold)
soup.bはTagオブジェクトである.soup.b['class']
またはgetメソッドsoupを用いる.b.get('class')すべての属性キー値ペアを取得:soup.b.attrs tagのプロパティは、追加、削除(del soup.b['class'])、変更、辞書メソッドと同じです.1つの属性keyが複数のvalueに対応する場合、css_soup = BeautifulSoup('
') print css_soup.p.attrs :{'class': ['body', 'strikeout'], 'name': 'lzy'}
这种多个值的属性是需要在HTML中有定义的,如果并没有被定义为多值属性,则返回字符串:
id_soup = BeautifulSoup('')
id_soup.p['id']
'my id'
変換がXMLドキュメントの場合、多値属性は存在せず、文字列が返されます.リストまたは文字列を使用して、属性に値を割り当てることができます.
soup.name
u'[document]'
Elsie
使用前に判断したほうがいいです.判断コードは以下の通りです.
if type(soup.a.string)==bs4.element.Comment:
print soup.a.string
soup.find_all('tag_name')
tagを使用する必要がある.contentsプロパティは、すべてのサブノードをリストで出力します.tagの.childrenジェネレータは,すべてのサブノードを遍歴する.contentsと.childrenはTagを取得する直接サブノードのみに対して,descendantsは、Tagのすべての子孫ノードを巡回するために使用することができる.tagがNavigablesStringタイプのサブノードが1つしかない場合、.string
で取得できます.複数を含む場合は、.strings
を使用して巡回します.出力された文字列にスペースまたは空白行が含まれている場合は、.stripped_strings
を使用して除去します.find(str)
とfind_all(str)
を検索します.その中のstrは、tagのnameを表しています.純粋な文字列、正規表現、リスト(いずれかの一致が条件、はいまたは演算を満たす)、True(すべてのTagノードを返して文字列ノードを返さない)でもよい.もう1つのパラメータはstrではなくmethodです.このメソッドは、1つの要素のみを受け入れる関数です.この関数がTrueを返すと、パラメータマッチング要件が表示されます.例:def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
以上、フィルタには、純粋な文字列、正規表現、リスト、True、メソッドのいくつかが含まれます.
- name :
tagのnameプロパティを指し、文字列オブジェクトが自動的に無視されます.フィルタはすべての種類を使用できます.-keywordパラメータ:1つのパラメータが名前を指定しているが、上記のパラメータ名ではない場合、検索時にそのパラメータをtagの属性として検索します.たとえば、
soup.find_all(id='link2')
は、tagに属性idが存在し、idに対応する値がlink 2のtagであることを返します.以上の方法では、方法以外のすべてのフィルタを使用できます.-いくつかの特殊な属性はこのように直接使用できない場合、soup.find_all(attrs={"key":"value"})
を使用して、例えばclass属性を使用して検索します.classはpythonの保持字であり、直接入参に書くことはできません.現在、2つの方法があります.soup.find_all('tag.name',class_='class_value')
soup.find_all('tag.name',attrs={'class':'class_value'})
class_メソッドは、すべてのフィルタを使用できます.またclassは多値属性であるため,1つの値をマッチングするだけで結果が得られる,いわゆる不完全マッチングである.完全一致を使用する場合、フィルタ内の文字の順序は実際と一致する必要があります.-textパラメータ:Tagの文字列の内容を検索し、すべてのフィルタを使用できます.-limitパラメータ:戻り数を制限します.-recursiveパラメータ:find_all()のデフォルトは、現在のノードのすべての子孫ノードを検索し、直接のサブノードのみを検索する場合は
recursive=False
を設定します.find_all() 。
等価の簡略化版があります
soup('a')```
2. find(name,attrs,recursive,text,**kwargs)
find() find_all(limit=1), 。
, , 。 , None, 。
:
soup.find('head').find('title') soup.head.title
find() find_all() :
find_parent()
find_next_sibling()
find_previous_sibling()
's' 。
find_next()
find_previous()
find_all_next()
find_all_previous()
3. CSS
Tag BeautifulSoup .select() 。
7. ** **
prettify() 。
, python str() unicode()。
tag , get_text(), , 。 Unicode。
get_text("|") “|” 。
get_text(strip=True) 。
.stripped_strings 。
7. ** **
BeautifulSoup , , :lxml, html5lib,python 。 lxml xml 。