从标签中仅提取文本的最佳正则表达式是什么?如果我有例如这种 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 标签的数量不固定,其中一些会有类属性,但我只对从 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 标签的数量不固定,其中一些会有类属性,但我只对从 td 标签内部获取文本感兴趣
与其花时间在正则表达式上,不如使用为任务设计的东西。我喜欢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']
正则表达式<td.*?>(.*?)<\/td>
会正确执行。
但我可以推荐你使用HTMLParser 模块或BeautifulSoup
花时间给你写了另一个使用 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.
正则表达式不是为解析 HTML 而设计的。HTML 不是正则语言,不能用正则表达式轻松解析。
很多人喜欢BeautifulSoup
,但它很慢(另一个来源)并且不如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']