[关闭]
@qinian 2018-07-20T13:14:04.000000Z 字数 1892 阅读 957

Beautifulsoup4库学习

爬虫


Beautiful Soup是一个可以从HTMLXML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
参考:中文文档


html演示代码

  1. html_doc = """
  2. <html><head><title>The Dormouse's story</title></head>
  3. <body>
  4. <p class="title"><b>The Dormouse's story</b></p>
  5. <p class="story">Once upon a time there were three little sisters; and their names were
  6. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
  7. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  8. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  9. and they lived at the bottom of a well.</p>
  10. <p class="story">...</p>
  11. """

基本用法

  1. from bs4 import BeautifulSoup # 解析html,官方推荐写法
  2. soup = BeautifulSoup(html_doc, 'lxml') # 以lxml解析器解析,本地导入写法
  3. #soup = BeautifulSoup(open("index.html"))
  4. soup.prettify() # 补全html代码,容错。
  5. print(soup.prettify())
  6. print(soup.p) # 第一个p标签
  7. print(soup.a)
  8. print(soup.title.string) #标题内容
  9. print(soup.title.name) # 标题的名称
  10. print(soup.head)
  11. print(soup.p['class']) # p标签下class属性的值
  12. soup.find_all('a') # 找到所有a标签
  13. soup.find(id="link3") # 找到id值是link3的标签
  14. for link in soup.find_all('a'):
  15. print(link.get('href'))
  16. print(soup.get_text()) # 从soup中获取文字

遍历文档树

  1. 1tagcontent属性可以将tag的子节点和子孙节点以**列表**的方式输出
  2. print(soup.p.contents)
  3. print(soup.p.contents[1])
  4. 2children返回的不是一个 list,不过我们可以通过遍历获取所有子节点,它是一个 list 生成器对象,i是索引,child是内容。
  5. for i,child in enumenerate(soup.p.children):
  6. print(i,child)
  7. 3、通过子节点可获得其父节点,祖先节点,以及上下兄弟节点
  8. soup.a.parent
  9. soup.a.parents
  10. soup.a.next_sliblings (下一个)
  11. soup.a.previous_sliblings (上一个)
  12. 4,寻找节点,以下几种传递方式
  13. soup.find_all('a') # 找到所有a标签
  14. print(soup.find_all("a", limit=2)) #限制搜索结果数
  15. for link in soup.find_all('a'):
  16. print(link.get('href'))
  17. soup.find_all(id='1')
  18. soup.find_all(class_='name')#关键字 class Python中是保留字,使用 class 做参数会导致语法错误,可用class_
  19. soup.find_all(text='文本')
  20. print(soup.find_all(['title','b'])) # 传递列表进去,匹配到同时又两个标签相同的标签
  21. import re
  22. '''传递正则表达式'''
  23. for tag in soup.find_all(re.compile("^b")):
  24. print(tag.name)
  25. print(soup.find_all(attrs={"class":"title"}))#attrs参数,定义一个字典参数来搜索包含特殊属性的tag
  26. 5css选择器
  27. soup.select("title")
  28. soup.select("p:nth-of-type(3)")
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注