使用Beautiful Soup解析Html文件时出现意外输出

时间:2018-03-14 01:34:05

标签: python html beautifulsoup

我有一个Basic Html文件,其中包含标签内的文本,如下所示:

<head>
<title></title>
</head>
<body>
<div>{#One#}</div>
<span>{#Two#}</span>
<b>{#Three#}</b>
<i>four</i>
<td>{#five#}</td>
<sup>{#six#}</sup>
<sub>{#seven#}</sub>
<i>eight</i>
</body>

使用Python我想解析这个文件并检查一个特殊的字符(例如。&#39; {&#39;)如果这个字符不存在则返回该行和它不是的数字当下。所以我为它写了一个小片段。

from bs4 import BeautifulSoup
import re
import urllib2

url = "testhtml.html"
page = open(url)
soup = BeautifulSoup(page.read())
bdy = soup.find('body')
for lines in bdy:
  for num,line in enumerate(lines,1):
     if "{"  not in word:
        print num,lines

然而,当我运行程序时,我得到一个奇怪的输出:如下所示:

1  
1
1
1
1
1<i>four</i>
1
1
1
1<i>eight</i>

而不是:

 4<i>four</i>
 8<i>eight</i>

我在这里做错了什么,这似乎是一个愚蠢的错误。

2 个答案:

答案 0 :(得分:0)

使用find('body')会将整个body标记及其所有内容作为单个元素返回。因此,迭代bdy并没有给出您的想法。

您需要使用bdy.find_all(True),这将返回body内的所有标记。然后,将if语句更改为if '{' not in tag.text:

soup = BeautifulSoup(html, 'lxml')
bdy = soup.find('body')
for i, tag in enumerate(bdy.find_all(True), 1):
    if '{' not in tag.text:
        print(i, tag)

输出:

4 <i>four</i>
8 <i>eight</i>

答案 1 :(得分:-1)

from bs4 import BeautifulSoup
import re
import urllib2

url = "index.html"
page = open(url)
soup = BeautifulSoup(page.read(), "html.parser")
soup.prettify()
bdy = soup.find('body')
for num, lines in enumerate(bdy):
    for line in lines:
        if line !='\n' and '{' not in line:
            print num, lines