Python和BeautifulSoup4:从表中查找某些文本并解析下一个表

时间:2015-07-10 19:15:52

标签: python parsing beautifulsoup

在尝试使用BeautifulSoup获取某些数据时,我遇到了一个非常棘手的问题。

我想找到所有包含特定文本的表(在我的示例代码中'Name:','City:'和'Address:')并解析位于下一个表中的文本在源代码中。

页面源代码:

...
...
<td>Name:</td>
<td>John</td>
...
<td>City:</td>
<td>London</td>
...
<td>Address:</td>
<td>Bowling Alley 123</td>
...
...

我想解析:“John”,“London”,“Bowling Alley 123”

抱歉,我这里没有任何python代码来显示我过去的努力,但这是因为我不知道从哪里开始。谢谢!

2 个答案:

答案 0 :(得分:0)

这很笨重,但取决于您的TD包裹方式以及您的TD目标的一致性,您应该能够找到它们,遍历它们并使用findNextSibling()来获取您的数据:

from BeautifulSoup import BeautifulSoup

html = """\
<table>
 <tr>
  <td>Name:</td>
  <td>John</td>
 </tr>
 <tr>
  <td>City:</td>
  <td>London</td>
 </tr>
 <tr>
  <td>Address:</td>
  <td>Bowling Alley 123</td>
 </tr>
</table>
"""

targets=["City:","Address:","Name:"]
soup = BeautifulSoup(html)
for tr in soup.findAll("tr"):
    for td in tr.findAll("td"):
        if td.text in targets:
            print td.findNextSibling().text

最重要的是,只要你有一些包含你的TD的正常/正常元素,使用NextSibling功能就可以让你到达目的地。

答案 1 :(得分:0)

这是否正常工作取决于HTML是否正确形成,但即使有无关的换行符或其他文本也可能有效。

import bs4

def parseCAN(html):
    b = bs4.BeautifulSoup(html)
    matches = ('City:', 'Address:', 'Name:')
    found = []
    elements = b.findAll('td')
    for n, e in enumerate(elements):
        if e.text not in matches:
            continue
        if n < len(elements) - 1:
            found.append(elements[n+1].text)
    return found