刮擦身体中的大部分文字

时间:2012-11-18 07:33:49

标签: python html screen-scraping beautifulsoup lxml

我正在学习如何使用lxml / BeautifulSoup,我想知道如何尽可能方便地做到这一点。源有它的身体结构:

<p class = "info">
    <!-- a bunch of other tags and text in each paragraph class -->
</p>
<p class = "filler1">
</p>
<p class = "filler2">
</p>
<p class = "filler2">
</p>
<p class = "repeat">
</p>
<p class = "repeat">
</p>
<p class = "descr">
</p>
<p class = "descr">
</p>
<p class = "descr">
</p>

目前我只是在使用

soup = BeautifulSoup(open('savedPage.html'))
soup.body(text=True)

刮去身上的所有文字。我想知道是否有一种快捷方便的方法: 1)刮掉“filler2”之后的段落类中的所有文本,和 2)避免转义序列

关于2),我知道我可以通过迭代

来绕过这个问题
for i in range(1,len(soup.body(text=True))+1):
    soup.body(text=True)[i]

将解释所有转义序列。但是,对于1),是否有一种方法可以在“filler2”类之后删除所有仍保持代码简单的文本?不想遍历整棵树或写正则表达式。

1 个答案:

答案 0 :(得分:0)

你可以试试这样的东西 - 假设你试图从身体中获取大部分文本。

data = urllib2.urlopen(link)
content = data.read()
# replace the script and style tags with html comments, so the bs4 just skips them
content = content.replace("<script", "<!--")
content = content.replace("</script>", "-->")
content = content.replace("<style", "<!--")
content = content.replace("</style>", "-->")
soup = BeautifulSoup(content, "lxml") # assuming you've imported lxml and bs4
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
Comments = [comment.extract() for comment in comments] # remove the commenys
words = []
for i in soup.stripped_strings:
    print i
# i will print most of the text of the page line by line
嗯,这种方法并不是最干净的方法。但它应该可以正常工作。