使用Python BeautifSoup

时间:2016-10-28 02:33:46

标签: python html parsing beautifulsoup

我的HTML知识非常有限,我只是开始使用美味的汤,所以我的问题可能没有正确构建。 我的HTML源代码看起来像这样

<TD width="15%">Text1</TD>
<TD width="85%">Text2<A href="link1">(6)</A> 
Text3<A href="link2">(4)</A> 
</TD>

它在网页上显示为Text1 / Text2和Text1 / Tex3(可能是由于某些我不理解的代码,我可能没有在这里复制)。

但是,我正在尝试用BeautifulSoup编写Python代码来解析Python对象中的这些信息。我认为第一步是单独提取文本然后再合并它们。我可以使用像这样的代码轻松提取Text1

url = "my url (static page stored locally)"
soup = BeautifulSoup(open(url),'lxml')
t1_soup=soup.find_all('td',{'width':'15%'})
t2_soup=soup.find_all('td',{'width':'75%'})


text1_str=[]
for item in t1_soup:
text1_str.append(item.text)


text2_str=[]
for item in t2_soup:
text2_str.append(item.text)

第一个for循环为我提供了干净的text1,但是第二个for循环给了我一个字符串'text2 text3'。我不知道如何将它们分开以便最终将其转换为text1 / text2和text1 / text3

我编写的python代码可能效率也不高,如果你有建议更好地解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以通过查找a中的所有td元素并获取previous text siblings来解决此问题:

for item in t2_soup:
    print([a.previous_sibling.strip() for a in item.find_all("a")])

打印[u'text2', u'text3']

或者,您可以非递归地找到每个td 中的所有文本节点

for item in t2_soup:
    print([text.strip() for text in item.find_all(text=True, recursive=False)])

这可能会产生额外的空字符串 - 请务必过滤它们。