如何匹配正则表达式中的字符串,特殊字符和HTML标记?

时间:2017-01-23 13:23:42

标签: python html regex beautifulsoup

我正在尝试匹配混合了一些普通字符串的HTML文本。 我已经完成了大部分工作,但是HTML字符串中的字符串问题。

所以我试图找到的文字看起来像这样:

>(\n(optional))</td>\n<td style="text-align:right">Text i want</td>\n

所以主要问题是可选部分,因为它有\ n()和字符串,并且所有部分都是可选的。

到目前为止我所做的是:

reg_num = r'></td>\\n<td style="text-align:right">.*?</td>\\n'
reg_num1 = r'(?<="\>).*?(?=\</)'
pattern = re.compile(reg_name)
pattern1 = re.compile(reg_num)
pattern2 = re.compile(reg_num1)
pup = re.findall(pattern1, str(html_text))
new_pup = re.findall(pattern2,str(pup))

我上面做的是先找到文本,然后找到我想要的文字。 此代码适用于所有没有可选文本的结果。

当有可选文字时,我应该添加什么才能获得匹配?

有没有更好的方法可以在不分割的情况下找到一行文字?

2 个答案:

答案 0 :(得分:3)

你不应该使用正则表达式来解析HTML,你应该使用像XPath查询或css / jQuery选择器这样的工具。

允许您解析HTML的包是BeautifulSoup。例如:

from bs4 import BeautifulSoup

soup = BeautifulSoup(str(html_text))
for td_tag in soup.find_all('td',{'style':'text-align:right'}):
    print(td_tag.text) #or do something else with the text

在此,您将其解析为soup对象,然后您迭代所有<td>个标记,这些标记的属性style正好为"text-align:right"。现在对于所有这些td_tag,您打印.text(显然您可以使用它做其他事情)。

如果您想构建所有这些文本的列表,可以使用 list comprehension

from bs4 import BeautifulSoup

soup = BeautifulSoup(str(html_text))
all_texts = [td_tag.text for td_tag in soup.find_all('td',{'style':'text-align:right'})]

正如您所看到的,在这里指定您想要提取的内容,不需要编写容易失败甚至无法构造的复杂正则表达式。人们可以很容易地阅读你想要提取的内容。

答案 1 :(得分:-3)

我建议你使用beautifulsoup Python包。