Beautiful Soup中的Tag对象有两个有用的属性,用于提供其在HTML文档中的位置信息:
-
-
sourcepos
—— 标签在其所在行的起始索引
这些属性由Python内置的解析器html.parser
和html5lib
解析器支持。但在使用lxml
解析器时,这些属性不可用。
在下面的例子中,我们将使用html.parser
解析一个HTML字符串,并找出<p>
标签在HTML字符串中的行号和位置。
示例
html = '''
<html>
<body>
<p>Web frameworks</p>
<ul>
<li>Django</li>
<li>Flask</li>
</ul>
<p>GUI frameworks</p>
<ol>
<li>Tkinter</li>
<li>PyQt</li>
</ol>
</body>
</html>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
p_tags = soup.find_all('p')
for p in p_tags:
print(p.sourceline, p.sourcepos, p.string)
输出
4 0 Web frameworks
9 0 GUI frameworks
对于html.parser
,这些数字代表初始小于号的位置,在此示例中为0。当使用html5lib
解析器时,情况略有不同。
示例
html = '''
<html>
<body>
<p>Web frameworks</p>
<ul>
<li>Django</li>
<li>Flask</li>
</ul>
<p>GUI frameworks</p>
<ol>
<li>Tkinter</li>
<li>PyQt</li>
</ol>
</body>
</html>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html5lib')
li_tags = soup.find_all('li')
for l in li_tags:
print(l.sourceline, l.sourcepos, l.string)
输出
6 3 Django
7 3 Flask
11 3 Tkinter
12 3 PyQt
当使用html5lib
时,sourcepos
属性返回最终大于号的位置。