2

HTMLページの一部を解析したい

my_string = """
<p>Some text. Some text. Some text. Some text. Some text. Some text.
   <a href="#">Link1</a>
   <a href="#">Link2</a>
</p>
<img src="image.png" />
<p>One more paragraph</p>
"""

この文字列をBeautifulSoupに渡します。

soup = BeautifulSoup(my_string)
# add rel="nofollow" to <a> tags
# return comment to the template

しかし、BeautifulSoupの解析中<html>に、タグ<head><body>タグ(lxmlまたはhtml5libパーサーを使用している場合)が追加されるため、コードにこれらは必要ありません。これを回避するためにこれまでに見つけた唯一の方法は、を使用することhtml.parserです。

最速のパーサーであるlxmlを使用して冗長なタグを取り除く方法があるのだろうか。

アップデート

もともと私の質問は間違って尋ねられました。<div>一般ユーザーはこのタグを使用しないため、ここで例からラッパーを削除しました。このため、.extract()メソッドを使用して、、<html>および<head>タグ<body>を削除することはできません。

4

3 に答える 3

1

使用する

soup.body.renderContents()
于 2012-12-05T09:22:00.170 に答える
0

.contentsプロパティを使用して問題を解決できます。

try:
    children = soup.body.contents
    string = ''
    for child in children:
        string += str(item)
    return string
except AttributeError:
    return str(soup)

''.join(soup.body.contents)リストから文字列への変換の方が適切だと思いますが、これは機能せず、次のようになります。

TypeError:シーケンス項目0:予期された文字列、タグが見つかりました

于 2012-07-11T22:39:52.137 に答える
0

lxmlは常にこれらのタグを追加しますが、タグをタグ内からTag.extract()削除するために使用できます。<div>

comment = soup.body.div.extract()
于 2012-07-01T15:19:50.470 に答える