我正在尝试匹配混合了一些普通字符串的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))
我上面做的是先找到文本,然后找到我想要的文字。 此代码适用于所有没有可选文本的结果。
当有可选文字时,我应该添加什么才能获得匹配?
有没有更好的方法可以在不分割的情况下找到一行文字?
答案 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包。