我正在使用BeautifulSoup从HTML页面中提取一些数据。我在做的是:
list=soup.find_all('td', {'align': 'left', 'valign': None})
print list[0]
它给了我
<td align="left">\n<h3>Name XYZ</h3>\n CTS SANSKRUTI LAYOUT, 90 FEET RAOD, THAKUR COMPLEX, <br/>KANDIVALI EAST,<br/>Mumbai MAHARASHTRA-400101</td>
但我希望输出如下:
Name: Name XYZ, Add: CTS SANSKRUTI LAYOUT, 90 FEET RAOD, THAKUR COMPLEX, KANDIVALI EAST, Mumbai MAHARASHTRA-400101
我该怎么办?
答案 0 :(得分:0)
find_all将返回标记列表,因此当您访问列表list[0]
中的第一个项目时,它将返回第一个标记,就像输出一样
如果要为标记提取文本,可以使用tag.text,在您的情况下
list[0].text
答案 1 :(得分:0)
实际上,根据您的需求,我认为有两种方法可供选择。
我不确定你想要的输出前面的“名称”和“添加”字符串是否是拼写错误,所以这里有两种可能的方式我会看到:
list_tags
方法获得的find_all
的每个标记下方的所有文字,而不进行任何操作,例如将每个单词分开,请转到{{1}方法。有了它,你可以选择一个简单的列表理解,如:
get_text()
>>> simple_uni_text = [tag.get_text() for tag in list_tags]
>>> simple_uni_text
[u'\nName XYZ\n CTS SANSKRUTI LAYOUT, 90 FEET RAOD, THAKUR COMPLEX, KANDIVALI EAST,Mumbai MAHARASHTRA-400101', u'\nName ABC\n DUT WITHOUT LAYIN, 45 FOOT AODR, RUKTHA SIMPLE, BOMBAY WEST,BOMBAY RASHTRAMAHA-400101']
>>> len(simple_uni_text)
>>> 2 # I pretended the list_tags to have two tags, so it generated a list of length two!
生成器。 它可能是一种棘手的方法。但你可以获得精确度。
stripped_strings
在这里,您将list_tags的每个标签下面的每个字符串与另一个字符串分开。因此,如果您确实要在文本前面添加以下“名称”和“添加”,那么它可以更好地符合您的需求。
>>> uni_stripped_words = []
>>> for tag in list_tags:
for string in tag.stripped_strings:
uni_stripped_words.append(string)
>>> uni_stripped_words
[u'Name XYZ', u'CTS SANSKRUTI LAYOUT, 90 FEET RAOD, THAKUR COMPLEX,', u'KANDIVALI EAST,', u'Mumbai MAHARASHTRA-400101', u'Name ABC', u'DUT WITHOUT LAYIN, 45 FOOT AODR, RUKTHA SIMPLE,', u'BOMBAY WEST,', u'BOMBAY RASHTRAMAHA-400101']
>>> len(uni_stripped_words)
8
然而,我发现第二种方法不太可控。例如,有时会出现意想不到的字符。在将输出写出到文件时,我更喜欢连接!
无论如何,在这两种情况下,不要忘记结果列表将包含unicode类型的提取文本。
干杯