如何使用BeautifulSoup处理特定标记中的不同格式

时间:2014-08-21 03:25:40

标签: python web-scraping beautifulsoup

我希望能够单独处理HTML文件中的某些标签。我的代码工作正常(到目前为止)除了两个以外的所有标签。这两个有两条线而不是一条。这是我的代码:

from bs4 import BeautifulSoup

with open("F:/gpu.txt") as f:
    soup = BeautifulSoup(f)
    section = soup.find_all("td")
    #print(section[2])
    for section in section:
        if section.parent(text="GPU Name:"):
            print(section.text)
        elif section.parent(text="GPU Variant:"):
            print (section.text)
        elif section.parent(text="Bus Interface:"):
            print (section.text)
        elif section.parent(text="Transistors:"):
            print (section.text)

它继续。但是,当我们到达时,让我们说“处理大小:”,html代码是不同的:

        <th>Process Size:</th>
      <td>
        Something 
                <br />
                Something Else
              </td>
    </tr>

对于所有其他情况,它就像:

      <th>GPU Name:</th>
      <td>BLABLA</td>
    </tr>
        <tr>
      <th>GPU Variant:</th>
      <td>BLABLA</td>
    </tr>
        <tr>
      <th>Bus Interface:</th>
      <td>BLABLA</td>
    </tr>
    <tr>
      <th>Transistors:</th>
      <td>BLABLA</td>
    </tr>

因此,当我运行我的脚本时,我得到以下结果:

BLABLA
BLABLA

        Something 

                Something Else

BLABLA
BLABLA

我需要的是能够单独使用“Something”和“Something Else”(并且没有那些白线和空格)和/或只做一件事,将其转换为如下字符串:某事/某事“。

很抱歉,如果我的信息不够清楚,英语不是我的第一语言。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在部分中找到所有文本节点(使用text=True)并将其与/结合使用:

print('/'.join(item.strip() for item in section.find_all(text=True)))

示例:

from bs4 import BeautifulSoup

data = """
<table>
    <tr>
      <th>GPU Name:</th>
      <td>BLABLA</td>
    </tr>
        <tr>
      <th>GPU Variant:</th>
      <td>BLABLA</td>
    </tr>
        <tr>
      <th>Process Size: </th>
      <td>BLABLA</td>
    </tr>
    <tr>
      <th>Transistors:</th>
      <td>BLABLA</td>
    </tr>
    <tr>
      <th>Process Size:</th>
      <td>
        Something
                <br />
                Something Else
              </td>
    </tr>
</table>
"""

soup = BeautifulSoup(data)
section = soup.find_all("td")

for section in section:
    if section.parent(text="GPU Name:"):
        print(section.text)
    elif section.parent(text="GPU Variant:"):
        print (section.text)
    elif section.parent(text="Process Size:"):
        print ('/'.join(item.strip() for item in section.find_all(text=True)))
    elif section.parent(text="Transistors:"):
        print (section.text)

打印:

BLABLA
BLABLA
BLABLA
Something/Something Else

答案 1 :(得分:0)

这非常特定于您的示例HTML,并且它依赖于换行符的存在,但您可以这样做:

from bs4 import BeautifulSoup

with open("F:/gpu.txt") as f:
    soup = BeautifulSoup(f)
    for section in soup.find_all("td"):
        print '/'.join([s.strip() for s in section.text.split('\n') if s.strip()])