使用Beautifulsoup从html页面中提取数据

时间:2014-05-12 04:58:34

标签: python html string beautifulsoup

<div class="name">
  &nbsp;&nbsp;
  <strong>
    <a target="_blank" href="/page3.html">
      SOME_Name_TEXT
    </a>
  </strong>
</div>

<div class="data">
  <img src="/page1/page2/Images/pic.png" height="13" width="13">
  &nbsp; SOME_Data_TEXT
</div>

我有一个包含不同类的html页面。我可以使用beautifulsoup

从不同的类中提取类“name”和“data”
myName = soup.findAll("div", {"class" : "name"})
myData = soup.findAll("div", {"class" : "data"})

但是当我运行脚本并分别打印myName和myData元素时得到的结果:

  SOME_Name_TEXT(as a link)
 SOME_Data_TEXT

问题是我不想要Â。这是因为 2 &nbsp;在第一个和第二个。

我只想把结果作为:

SOME_Name_TEXT(as a link)
SOME_Data_TEXT

在第一部分中,需要链接“SOME_Name_TEXT”。 不需要数据部分中的图像,我只想要第二部分中的原始文本,即“SOME_Data_TEXT”。我试过用str.split()来做。我怎样才能得到确切的结果?

3 个答案:

答案 0 :(得分:1)

由于您不想要&amp; nbsp,您可以执行以下操作:

myName = soup.findAll("div", {"class" : "name"})
myData = soup.findAll("div", {"class" : "data"})
if(myName && !soup.findAll(text="&nbsp;"))
{
    System.out.print(myName);
}

或第二种方法,这里str是你的myName:

str= "&nbsp; hey how are you doing"
str.decode("utf-8");
str = str.replace("&nbsp;", "")
print str

答案 1 :(得分:0)

您必须执行unicode替换才能删除&nbsp;,因为BS会将HTML实体转换为unicode字符。

Edit:
soup.prettify(formatter=lambda x: x.replace(u'\xa0', ''))

其他选项:对于myData,要获取文本,请执行以下操作:

myData = soup.findAll("div", {"class" : "data"})[0].find('img').contents[0].strip()

和myName:

myName = repr(soup.findAll("div", {"class" : "name"})[0].find('a'))
myName = re.sub(' ', '', myName)

这对你有用吗?

答案 2 :(得分:0)

最后在其他问题的帮助下解决了这个问题:

第一部分即

<div class="name">
      &nbsp;&nbsp;
      <strong>
        <a target="_blank" href="/page3.html">
          SOME_Name_TEXT
        </a>
      </strong>
    </div>

让这个块在x中,然后我使用print x.findNext('strong') 而对于第二部分,即

<div class="data">
  <img src="/page1/page2/Images/pic.png" height="13" width="13">
  &nbsp; SOME_Data_TEXT
</div>

我确实喜欢:

tmp = x.findNext('img')
print tmp.get_text().strip()