使用BeautifulSoup

时间:2015-06-03 20:28:41

标签: python regex bs4

我正在使用BS4解析HTML页面:

import re
import codecs
import MySQLdb
from bs4 import BeautifulSoup

soup = BeautifulSoup(open("sprt.htm"), from_encoding='utf-8')
sprt = [[0 for x in range(3)] for x in range(300)]
i = 0

for para in soup.find_all('p'):
    if para.strong is not None:
        sprt[i][0] = para.strong.get_text()
        sprt[i][1] = para.get_text()
        sprt[i][1] = re.sub(re.escape(sprt[i][0]), "", sprt[i][1], re.UNICODE)
        sprt[i][2] = sprt[i][1]
        sprt[i][2] = re.sub(r".+[\.\?][\s\S\n]", "", sprt[i][1], re.S)
        sprt[i][2] = re.sub(r".+Panel", "Panel", sprt[i][2], re.S)
        sprt[i][1] = re.sub(re.escape(sprt[i][2]), "", sprt[i][1])

i += 1
x = 0

我正在解析的页面中填充了类似于3的段落:

<p><strong>Name name. </strong>The Visual Politics of Play: On The Signifying Practices of Digital Games. Panel Proposal (2p)</p>
<p><strong>Name name and Name name. </strong>Pain, Art and Communication. Panel Proposal (2p)</p>
<p><strong>Name name, Name name and Name name. </strong>Waves of Technology: The Hidden Ideologies of Cognitive Neuroscience and the future production of the Iconic. Panel Proposal (2p)</p>

解析在最后一段之前正常工作:

<p><strong>Name name, Name name and Name name. </strong>Waves of Technology: The Hidden Ideologies of Cognitive Neuroscience and the future production of the Iconic. Panel Proposal (2p)</p>

我在数组的最后一个插槽中找到的是:

[u'Name name, Name name\xa0and Name name.\xa0', u'Waves\n of Technology: The Hidden Ideologies of Cognitive Neuroscience and the \nfuture production of the Iconic.\xa0Panel Proposal (2p)', u'Waves\n of Technology: The Hidden Ideologies of Cognitive Neuroscience and the \nfuture production of the Iconic.\xa0Panel Proposal (2p)']

有两个新行(\n)出现在奇怪的地方(Waves之后和future之前)。它们总是出现在相同的位置,而不是随机的。 我认为它们是由于段落的长度,但有一些较长的段落没有出现\n

我试图用以下方法删除它们:

sprt[i][2] = re.sub("\n", "", sprt[i][1], re.U, re.S)

但它没有用。

新线是否因为我在某处犯了错误?有没有办法删除它们?

2 个答案:

答案 0 :(得分:0)

sprt[i][2] = re.sub(r"\n", "", sprt[i][1], re.U, re.S)

                   ^^

您可以尝试使用raw模式。

答案 1 :(得分:0)

我怀疑换行实际上出现在源Html文件中。我试图使用你的段落重现你的错误,我没有得到任何\n,直到我在源文件中插入一个新行。这也可以解释为什么它没有发生在其他更长的段落中:它们根本没有在html源文件中有任何实际的换行符。

话虽如此,如果我添加你的re.sub行,我会删除换行符。 (我在sprt[i][2]得到了,但当然不是sprt[i][1] - 你有可能在那里看错了地方吗?)