使用BeautifulSoup或Regex解析无效的锚标记

时间:2012-05-07 18:57:29

标签: python regex parsing html-parsing beautifulsoup

我希望解析解析包含html锚标记的原始文档,但不幸的是它包含无效标记,例如:

<a href="A 4"drive bay">some text here</a>

我知道href值可能不是实际链接,但让我们保持这种方式。现在我需要的是检索href值'A 4"drive bay'和链接文本'some text here'

我正在使用python,我已经尝试了python库“BeautifulSoup”,它在检索所有锚标签时效果很好。但问题是当它遇到提到的无效锚标记时标记错误,其中href值包含''。原始数据中存在这样的情况我正在解析和修改这样的数据不是选项..

使用BeautifulSoup的我的python代码的一部分是:

sub_s = BeautifulSoup(line)
for l in sub_s.find_all('a'):
   l.replace_with(l.string)
print str(sub_s),

代码只是将锚标记替换为纯文本

如果有人可以帮我解决这个问题,我会非常感激... 正则表达式也会这样做.. ^^

2 个答案:

答案 0 :(得分:0)

我猜您可以通过正则表达式预先过滤输入文本以纠正此特定问题。类似的东西:

>>> r = re.compile('''<a[^>]+href="([^>]+)">''')
>>> m = r.match(text)
>>> m.group(1)
'A 4"drive bay'
>>> r.sub('<a href="%s">' % m.group(1).replace('"', ' '), text)
'<a href="A 4 drive bay">some text here</a>'

这不是一个完整的解决方案;只是想知道如何前进。

答案 1 :(得分:0)

Selfhtm 8.1.2(德国经常使用的HTML文档)建议:

  1. 第一个位置拉丁字符(a-z,A-Z)
  2. 后来的拉丁字符,数字(0-9), - ,_或。
  3. 我使用以下正则表达式来确保第一个要求:

    name="[^a-zA-Z]
    

    (n。b。第一个领先的空间似乎不那么重要,适用于大多数正则表达式实现,例如来自helios的textpad编辑器)

    为了简化工作,我还有另一个要求的正则表达式:它还捕获一个字符锚(它们是有效的),但它将有助于识别可能的问题:

    name=".?[^a-zA-Z0-9_\.-][^"]*"
    

    我使用语法检查程序找到的大多数其他问题。