XPath
注意/和//的区别,其中/用于获取直接子节点,//用于获取子孙节点。
实例
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)
其余详情见链接
Beautiful Soup
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时你仅仅需要说明一下原始编码方式就可以了。
初始化
推荐使用lxml解析库,必要时使用html.parser。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)
prettify()方法。这个方法可以把要解析的字符串以标准的缩进格式输出。且可以自动更正格式。
选择与提取
选用节点选择法快速但不方便,在这里暂时先不讲(可看链接原文),先直接讨论信息筛选与提取法。
可以利用string属性获取节点元素包含的文本内容
print(soup.p.string)
嵌套选择
print(soup.head.title.string)
find_all()
格式
find_all(name , attrs , recursive , text , **kwargs)
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(name='ul'))
print(type(soup.find_all(name='ul')[0]))
循环遍历
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print(li.string)
属性查询(用attr)
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))
属性查询(直接用属性名)
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(id='list-1'))
print(soup.find_all(class_='element'))
由于class在Python里是一个关键字,所以后面需要加一个下划线
匹配文本或正则表达式
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text=re.compile('link')))
#该例子为正则
find()
除了find_all()方法,还有find()方法,只不过后者返回的是单个元素,也就是第一个匹配的元素,而前者返回的是所有匹配的元素组成的列表。
对于节点选择
find_parents()和find_parent():前者返回所有祖先节点,后者返回直接父节点。
find_next_siblings()和find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。
find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。
find_all_next()和find_next():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
find_all_previous()和find_previous():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
BS里的CSS选择器
选择
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))
嵌套选择
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
print(ul.select('li'))
获取属性
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
获取文本
for li in soup.select('li'):
print('Get Text:', li.get_text())
Pyquery
见链接吧,功能都类似就不细讲了