我的代码在Python中处理了以下文本:
<td>
<a href="http://www.linktosomewhere.net" title="title here">some link</a>
<br />
some data 1<br />
some data 2<br />
some data 3</td>
您能否告诉我如何从<td>
内提取数据?
我的想法是将其放在CSV文件中,格式如下:some link, some data 1, some data 2, some data 3
。
我希望如果没有正则表达式,它可能很难,但我真的仍然在与正则表达式斗争。
我以下列方式或多或少地使用了我的代码:
tabulka = subpage.find("table")
for row in tabulka.findAll('tr'):
col = row.findAll('td')
print col[0]
理想情况下是将每个td争用到某个数组中。上面的Html是python的结果。
答案 0 :(得分:13)
获取BeautifulSoup并使用它。太棒了。
$> easy_install pip
$> pip install BeautifulSoup
$> python
>>> from BeautifulSoup import BeautifulSoup as BS
>>> import urllib2
>>> html = urllib2.urlopen(your_site_here)
>>> soup = BS(html)
>>> elem = soup.findAll('a', {'title': 'title here'})
>>> elem[0].text
答案 1 :(得分:5)
你不应该在html上使用正则表达式。你应该使用BeautifulSoup或lxml。以下是使用BeautifulSoup的一些示例:
您的td标签实际上如下所示:
<td>newline
<a>some link</a>newline
<br />newline
some data 1<br />newline
some data 2<br />newline
some data 3</td>
所以td.text看起来像这样:
<newline>some link<newline><newline>some data 1<newline>some data 2<newline>some data 3
您可以看到每个字符串至少由一个换行符分隔,这样您就可以将每个字符串分开。
from bs4 import BeautifulSoup as bs
import re
html = """<td>
<a href="http://www.linktosomewhere.net" title="title here">some link</a>
<br />
some data 1<br />
some data 2<br />
some data 3</td>"""
soup = bs(html)
tds = soup.find_all('td')
csv_data = []
for td in tds:
inner_text = td.text
strings = inner_text.split("\n")
csv_data.extend([string for string in strings if string])
print(",".join(csv_data))
--output:--
some link,some data 1,some data 2,some data 3
或者更简洁:
for td in tds:
print(re.sub("\n+", ",", td.text.lstrip() ) )
--output:--
some link,some data 1,some data 2,some data 3
但是这个解决方案很脆弱,因为如果你的html看起来像这样,它就不会起作用了:
<td>
<a href="http://www.linktosomewhere.net" title="title here">some link</a>
<br />some data 1<br />some data 2<br />some data 3</td>
现在td.text看起来像这样:
<newline>some link<newline>some data 1some data2some data3
并且没有办法弄清楚某些字符串的开始和结束位置。但这只是意味着你不能使用td.text - 还有其他方法来识别每个字符串:
1)
from bs4 import BeautifulSoup as bs
import re
html = """<td>
<a href="http://www.linktosomewhere.net" title="title here">some link</a>
<br />some data 1<br />some data 2<br />some data 3</td>"""
soup = bs(html)
tds = soup.find_all('td')
csv_data = []
for td in tds:
a_tags = td.find_all('a')
for a_tag in a_tags:
csv_data.append(a_tag.text)
br_tags = a_tag.findNextSiblings('br')
for br in br_tags:
csv_data.append(br.next.strip()) #get the element after the <br> tag
csv_str = ",".join(csv_data)
print(csv_str)
--output:--
some link,some data 1,some data 2,some data 3
2)
for td in tds:
a_tag = td.find('a')
if a_tag: csv_data.append(a_tag.text)
for string in a_tag.findNextSiblings(text=True): #find only text nodes
string = string.strip()
if string: csv_data.append(string)
csv_str = ",".join(csv_data)
print(csv_str)
--output:--
some link,some data 1,some data 2,some data 3
3)
for td in tds:
a_tag = td.find('a')
if a_tag: csv_data.append(a_tag.text)
text_strings = a_tag.findNextSiblings( text=re.compile('\S+') ) #find only non-whitespace text nodes
csv_data.extend(text_strings)
csv_str = ",".join(csv_data)
print(csv_str)
--output:--
some link,some data 1,some data 2,some data 3
答案 2 :(得分:0)
我从来没有使用 BeautifulSoup ,但我敢打赌,这是'html-tag-aware&#39;并且可以处理&#39;填充物&#39;空间。但由于html标记文件是结构化的(通常由Web设计程序生成),您还可以尝试使用Python的.split()
方法直接进行。顺便说一下,我最近使用这种方法来解析一个真实世界的url / html来做一些与OP想要的非常相似的事情。
虽然OP只想从<a>
标记中提取一个字段,但在下面我们将通常的两个字段拉出来。字段。
CODE:
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Extracting data from HTML using split()
# Link: https://stackoverflow.com/questions/17126686/extracting-data-from-html-with-python
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
page = """blah blah blah
<td>
<a href="http://www.link1tosomewhere.net" title="title1 here">some link1</a>
<br />
some data1 1<br />
some data1 2<br />
some data1 3</td>
mlah mlah mlah
<td>
<a href="http://www.link2tosomewhere.net" title="title2 here">some link2</a>
<br />
some data2 1<br />
some data2 2<br />
some data2 3</td>
flah flah flah
"""
#--------*---------*---------*---------*---------*---------*---------*---------#
while 1:# M A I N L I N E #
#--------*---------*---------*---------*---------*---------*---------*---------#
page = page.replace('\n','') # remove \n from test html page
csv = ''
li = page.split('<td><a ')
for i in range(0, len(li)):
if li[i][0:6] == 'href="':
s = li[i].split('</td>')[0]
# # li2 ready for csv
li2 = s.split('<br />')
# # create csv file
for j in range(0, len(li2)):
# # get two fields from li2[0]
if j == 0:
li3 = li2[0].split('"')
csv = csv + li3[1] + ','
li4 = li3[4].split('<')
csv = csv + li4[0][1:] + ','
# # no comma on last field - \n instead
elif j == len(li2) - 1:
csv = csv + li2[j] + '\n'
# # just write out middle stuff
else:
csv = csv + li2[j] + ','
print(csv)
sys.exit()
输出:
>>>
= RESTART: C:\Users\Mike\AppData\Local\Programs\Python\Python36-32\board.py =
http://www.link1tosomewhere.net,some link1,some data1 1,some data1 2,some data1 3
http://www.link2tosomewhere.net,some link2,some data2 1,some data2 2,some data2 3
>>>