首页 文章

从BeautifulSoup对象中删除标记

提问于
浏览
1

我在论坛网站上抓 table 时遇到一些困难(每页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 回答

  • 1

    正如您已经注意到 <b><i>..</b></i> 乱序,因此HTML格式错误 . html.parser 不能尝试 lxml 对你的测试用例,它的确有效 .

    soup = BeautifulSoup(content, "lxml")
    

相关问题