Data extraction of bs4
beautifulsoup support parser
-
Parser Instructions Advantage Disadvantaged Python Standard Library BeautifulSoup(markup, "html.parser")
Built-in standard Python library execution speed of moderate intensity document fault tolerance Version of Python 2.7.3 or 3.2.2) before the document fault tolerance poor lxml HTML parser BeautifulSoup(markup, "lxml")
Strong speed document fault tolerance You need to install the C language library lxml XML parser BeautifulSoup(markup, ["lxml-xml"])``BeautifulSoup(markup, "xml")
The only support fast XML parser You need to install the C language library html5lib BeautifulSoup(markup, "html5lib")
The best fault tolerance to the way the browser parses the document format document generation HTML5 Does not depend on external expansion slow bs4 commonly used objects:
1:tag 对象与XML或HTML原生文档中的tag相同 ---tag的属性操作方法与字典一样 2:NavigatableString:用来包装tag中的字符串 3:BeautifulSoup 4:Comment
Basic Usage
from bs4 import BeautifulSoup soup=BeautifulSoup(html,'lxml') #首先解析为Unicode文档,然后BS会选择最合适的解析器来解析这段文档,这里是指定lxml解析 print(soup.prettify()) #把要解析的字符串以标准的格式输出
Node Selector: single hierarchy of nodes is very clear, it is recommended to use
1:获取名称--name获取title的节点名称 soup.title.name 2-1:获取属性的值 soup.p.attres #获取p节点的所有属性值 soup.p.attrs['title'] #获取title的属性值 2-2:[]直接获取属性的值 soup.p["name"] soup.p["title"] 3:获取节点的文本内容 string soup.p.string 4:嵌套选择---由于html文档的嵌套,bs4.element.Tag可以继续调用节点进行选择 soup.head.title.string #输出title的文本内容 5:关联选择 子节点: 选取节点p之后,获取它的直接子节点---返回一个列表["文本","子节点"]--不会单独列出子孙节点 soup.p.contents soup.p.children #返回一个生成器,遍历输出结果 子孙节点: soup.p.descendants #返回一个生成器,遍历输出结果 父节点:parent 祖先节点:parents
- Method selector
find_(name,attes,recursive,text,**kwargs):查询所有符合条件的元素,传入一些属性或文本 1:name根据节点名查找元素--返回一个列表 soup.find_all(name="a") soup.find_all('a') 2:attrs根据一些属性来查询 soup.find_all('a',id="test",class_="test") #注意class_ href=soup.a.attrs['href'] soup.find_all(attrs={'class':'test'}) 3:text参数可用来匹配节点的文本,传入的形式可以使str和正则表达式 soup.find_all(text=re.compile('link-1.html'))
CSS selectors
CSS选择器需要调用select()方法 soup.select('.panel .panel-heading') #class soup.select('#list-2 .element') # #-id soup.select('ul li') #普通标签:选择所有ul节点下的所有li节点 获取属性 遍历列表之后,Tag类型 ul['id'] ul.attrs['id'] 获取文本:get_text() for li in soup.select('li'): print("Get Text:",li.get_text()) print("String:",li.string)
important point:
## string和strings、stripped_strings属性以及get_text方法: 1. string:获取某个标签下的字符串[1个]。返回来的是个字符串。 2. strings:tag中包含【多个】字符串,子孙字符串。返回来的是个生成器。 2. stripped_strings:输出的字符串中可能包含了很多空格或空行。返回来的是个生成器。 4. get_text():获取某个标签下的所有字符串内容。以普通字符串返回。