如何在python beautifulsoup中加入工作

时间:2012-09-03 19:53:08

标签: python beautifulsoup

我正在学习python和beautifulsoup,并在网上看到了这段代码:

from BeautifulSoup import BeautifulSoup, SoupStrainer
import re

html = ['<html><body><p align="center"><b><font size="2">Table 1</font></b><table><tr><td>1. row 1, cell 1</td><td>1. row 1, cell 2</td></tr><tr><td>1. row 2, cell 1</td><td>1. row 2, cell 2</td></tr></table><p align="center"><b><font size="2">Table 2</font></b><table><tr><td>2. row 1, cell 1</td><td>2. row 1, cell 2</td></tr><tr><td>2. row 2, cell 1</td><td>2. row 2, cell 2</td></tr></table></html>']
soup = BeautifulSoup(''.join(html))
searchtext = re.compile(r'Table\s+1',re.IGNORECASE)
foundtext = soup.find('p',text=searchtext) # Find the first <p> tag with the search text
table = foundtext.findNext('table') # Find the first <table> tag that follows it
rows = table.findAll('tr')
for tr in rows:
    cols = tr.findAll('td')
    for td in cols:
        try:
            text = ''.join(td.find(text=True))
        except Exception:
            text = ""
        print text+"|",
    print

虽然其他一切都很清楚,但我无法理解联接是如何运作的。

    text = ''.join(td.find(text=True))

我尝试搜索BS文档以进行加入,但我找不到任何内容,也无法在网上找到有关如何在BS中使用联接的帮助。

请告诉我这条线的工作原理。谢谢!

PS:上面的代码来自另一个stackoverflow页面,它不是我的作业:) How can I find a table after a text string using BeautifulSoup in Python?

3 个答案:

答案 0 :(得分:5)

''.join()是一个python函数,而不是任何特定于BS的函数。它让你加入一个带有字符串作为连接值的序列:

>>> '-'.join(map(str, range(3)))
'0-1-2'
>>> ' and '.join(('bangers', 'mash'))
'bangers and mash'

''只是空字符串,可以将一整套字符串连接成一个大字符串更容易:

>>> ''.join(('5', '4', 'apple', 'pie'))
'54applepie'

在您的示例的特定情况下,该语句会查找<td>元素中包含的所有文本,包括任何包含的HTML元素,例如<b><i><a href="">并将它们组合成一个长串。所以td.find(text=True)找到一系列python字符串,然后''.join()将它们连接成一个长字符串。

答案 1 :(得分:0)

Join不是BeautifulSoup的一部分,但它是Python中内置的字符串方法。它将一系列元素与给定的字符串连接起来;例如,'+'.join(['a', 'b', 'c'])a+b+c。请参阅the documentation

答案 2 :(得分:0)

代码不正确。这一行:

text = ''.join(td.find(text=True))

使用find,它返回td标记的第一个字符串子项并尝试对其使用join。它正常工作,因为'.join()只是迭代第一个字符串子项,创建一个副本。

所以这个:

<td>foo<b>bar</b></td>

只运行''。join(“foo”)。

而是使用td.text属性。它会自动查找td中的所有字符串并加入它们。

text = td.text