在尝试使用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代码来显示我过去的努力,但这是因为我不知道从哪里开始。谢谢!
答案 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