从BeautifulSoup对象中删除标记

时间:2017-05-24 22:40:56

标签: python html beautifulsoup

我在论坛网站上抓桌子时遇到一些困难(每页50行)。我编写的代码适用于95%的内容,但是当存在粗体或斜体的行时会添加一个表格中断,但我没有得到完整的结果

大多数网页都有这样的标签:

<table>
  <td>
    content_1
  </td><td>
    content_2
  </td><td>
    content_3
  </td>
  ...
</table>

虽然当存在粗体或斜体短语时,无论出于何种原因,都会添加随机标签,而我最终只会在标签之前显示元素数量。

<table>
  <td>
    content_1
  </td><td>
      <b><i>content_2</b></i> *</table>*
  </td><td>
    content_3
  </td>
...
</table>

我不确定为什么会显示此标记(当我检查网页上的元素时,它不会显示。)

有没有人对如何处理此事有任何建议?我有一些想法,但没有一个想法。

  • 将beautifulsoup对象转换为字符串,然后删除标签并转换回beautifulsoup - 尚未完成,但似乎有点过分,会使程序变慢...

  • 只需跳过汤并使用pd.read_html - 还没有让它工作。

或者,如果有人对替代方法有任何建议,那也是值得赞赏的。谢谢!

编辑 - 如果我刚添加我的代码,它会有所帮助。如果主块有三个例子。第一个没有结果,第二个有部分结果,第三个是完整结果。

def get_page(URL):
    '''
    INPUT: url
    OUTPUT: pandas dataframe with message board info
    '''
    content = requests.get(URL).content
    soup = BeautifulSoup(content, "html.parser")
    rows = list(soup.find('table', id="ctl00_CP1_gv"))
    table_lst = []
    for row in rows[2:-2]:
      cell_lst = [cell for cell in list(row)[1:5]]
      table_lst.append(cell_lst)
    return pd.DataFrame(table_lst)

if __name__ == '__main__':
    url1 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=35092"
    url2 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=35099"
    url3 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=1000"
    df1 = get_page(url1)
    df2 = get_page(url2)
    df3 = get_page(url3)

1 个答案:

答案 0 :(得分:1)

由于您已经注意到<b><i>..</b></i>出现故障,因此格式错误的HTML。 html.parser无法处理这项工作。我已经针对您的测试用例尝试了lxml,但它确实有效。

soup = BeautifulSoup(content, "lxml")