如何使用findall提取元组?

时间:2016-06-20 21:15:41

标签: python regex findall

我正在尝试从 url 中提取元组,并且我设法使用{{1}提取字符串文本元组 }}。但是,当我尝试使用re.search(pattern_str, text_str)提取元组列表时,我陷入了困境。

文字如下:

re.findall(pattern_str, text_str)

我正在使用以下模式&用于提取元组的代码:

<li>
  <a href="11111">
    some text 111
    <span class="some-class">
      #11111
    </span>
  </a>
</li><li>
  <a href="22222">
    some text 222
    <span class="some-class">
      #22222
    </span>
  </a>
</li><li>
  <a href="33333">
    some text 333
    <span class="some-class">
      #33333
    </span>
  </a>
... # repeating
... 
... 

也许我正在尝试一些奇怪的事情。不可能,也许最好使用原始字符串操作来提取数据......但是如果存在解决方案?

2 个答案:

答案 0 :(得分:2)

您的正则表达式没有考虑\n<span之间的空格(缩进)。 (并且你想要捕获的行开头的空白都没有,但这不是一个问题。)要修复它,你可以添加一些\s*

pat_str = '<a href="(\d+)">\n\s*(.+)\n\s*<span class'

答案 1 :(得分:1)

正如评论中所建议的那样,使用像WinRM tasks这样的html解析器:

print([(a["href"].strip(), a.span.previous_sibling.strip()) for a in soup.find_all("a")])
[('11111', u'some text 111'), ('22222', u'some text 222'), ('33333', u'some text 333')]

您可以将href和previous_sibling转换为span:

print([(a["href"].strip(), a.contents[0].strip()) for a in soup.find_all("a")])

或href和锚点中的第一个内容:

.find(text=True)

或者[(a["href"].strip(), a.find(text=True).strip()) for a in soup.find_all("a")] 只能获取标记文本,而不是来自子标记。

[(a["href"].strip(), a.contents[0].strip()) for a in soup.select("li a")]

此外,如果你只想在列表标签​​中使用锚点,你可以专门解析它们:

mAdapter.addItem(1, item);