从BeautifulSoup对象中删除标签
问题描述:
我在从论坛网站(每页50行)刮取表格时遇到了一些困难。正如我写的代码所写,95%的内容可以工作,但在粗体或斜体线出现时会添加表格中断,但我无法获得完整结果从BeautifulSoup对象中删除标签
大多数页面都有类似这样的标签:
<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)
答
正如你已经注意到<b><i>..</b></i>
是坏的,因此HTML格式不正确。 html.parser
无法处理这项工作。我已经试过lxml
针对你的测试用例,它工作。
soup = BeautifulSoup(content, "lxml")
+0
看起来像是做到了。谢谢!我倾向于总是默认为html.parser。 – schustda
“......但是在出现粗体或斜体的行时会中断...”请显示打破的代码和错误消息(如果有的话)。 – DyZ
道歉,'打破',是错误的词选择。它只是不提供其他页面提供的完整结果。我将代码添加为示例页面...... – schustda
该webite很混乱......您能澄清一下您试图获得的那些网站的哪一部分,可能会有更好的标签可用吗? – Tony