2013-01-13 56 views
-2

可能重复选择文本表达:
RegEx match open tags except XHTML self-contained tags定期对内部​​</td>

什么是最好的正则表达式来提取标签只有文字?如果我有例如这样的HTML标记的

<tr class="classo"> 
<td>text1</td> 
<td class="dot">text2 </td> 
<td>text3</td> 
<td class="dot"> text4</td> 
<td class="dot">text4</td> 
</tr> 

TD标签的数量是不固定的,也有一些人将有class属性,但我从内td标签

获取文本我只有有趣
+0

你是什么意思提取;你是否希望将td标签之间的文本存储为一个JavaScript变量?或者你想改变标签内的文字? –

+4

使用HTML解析器。 – millimoose

+0

要解析HTML,通常最好使用已建立的库(比如[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)),而不是将自定义正则表达式放在一起。 – Yavar

回答

2

不要花时间使用正则表达式,而要使用为该任务设计的东西。我喜欢BeautifulSoup

>>> s = """ 
... <tr class="classo"> 
... <td>text1</td> 
... <td class="dot">text2 </td> 
... <td>text3</td> 
... <td class="dot"> text4</td> 
... <td class="dot">text4</td> 
... </tr> 
... """ 
>>> 
>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(s) 
>>> soup.find_all("td") 
[<td>text1</td>, <td class="dot">text2 </td>, <td>text3</td>, <td class="dot"> text4</td>, <td class="dot">text4</td>] 
>>> [tag.text for tag in soup.find_all("td")] 
[u'text1', u'text2 ', u'text3', u' text4', u'text4'] 
+0

我其实已经在BeautifulSoup中选择了表格行,但是我想从​​中逐行提取内容,所以我可以将它放在字典中并具有像这样的内容rowDict = {'row1':['text1','text2 ','text3'],'row2':['text1','text2','text3 ...']} – Zed

+0

A)如果您有其他要求,请编辑原始问题以包含它们。 B)如果你的键只不过是“row1”,“row2”等等,那么只需使用一个列表清单并将每行数据作为'rowData [0]','rowData [1]'等等。 – PaulMcG

1

正则表达式<td.*?>(.*?)<\/td>会做正确。

不过,我可能会建议你使用HTMLParser ModuleBeautifulSoup

我花了时间来使用的HTMLParser你写一个例子:

from HTMLParser import HTMLParser 

class TDExtractor(HTMLParser): 

    def handle_starttag(self, tag, attrs): 
     if tag == 'td': 
      self.recording = True 

    def handle_endtag(self, tag): 
     if tag == 'td': 
      self.recording = False 

    def handle_data(self, data): 
     if self.recording: 
      self.data.append(data) 

    def reset(self): 
     HTMLParser.reset(self) 
     self.data = [] 
     self.recording = False 

而且在行动:

> tdextractor = TDExtractor() 
> tdextractor.feed(some_htmldata) 
> print(tdextractor.data) # will print a list with all the td data. 
1

正则表达式不用于解析HTML。 HTML不是一种常规语言,不能用正则表达式很容易地解析。

很多人喜欢BeautifulSoup,但它是相当slowanother source)和不如lxml,它甚至可以使用BeautifulSoup作为一个解析器需要。

以下是使用lxml的解决方案。

>>> import lxml.html 
>>> html = lxml.html.fromstring(""" 
... <tr class="classo"> 
... <td>text1</td> 
... <td class="dot">text2 </td> 
... <td>text3</td> 
... <td class="dot"> text4</td> 
... <td class="dot">text4</td> 
... </tr>""") 
>>> print [e.text for e in html.xpath("td")] 
['text1', 'text2 ', 'text3', ' text4', 'text4']