python - 无法仅获取 1 次出现的链接

标签 python html regex beautifulsoup html-parsing

我在 HTML 中的 anchor 标记内有 3 个独特的链接。所有链接出现 2 次。我想做的是使用 python 正则表达式匹配仅获取 3 个链接一次,但无法这样做,仅此而已。

这是我的 HTML:

<html>
    <body>
        <ul class="asidemenu_h1">
            <li class="top">
            <h3>Mobiles</h3>
            </li>
            <li>
                <a href="http://www.mega.pk/mobiles-apple/" title="Apple Mobiles Price">Apple</a>
            </li>
            <li>
                <a href="http://www.mega.pk/mobiles-asus/" title="Asus Mobiles Price">Asus</a>
            </li>
            <li>
                <a href="http://www.mega.pk/mobiles-black_berry/" title="Black Berry Mobiles Price">Black Berry</a>
            </li>
        </ul>

        <ul class="start2" id="start2ul63" style="visibility: hidden; opacity: 0;">
            <li>
            <h3>Mobiles</h3>
                <ul class="start3 bolder-star">
                    <li>
                        <a href="http://www.mega.pk/mobiles-apple/">Apple</a>
                    </li>
                    <li>
                        <a href="http://www.mega.pk/mobiles-asus/">Asus</a>
                    </li>
                    <li>
                        <a href="http://www.mega.pk/mobiles-black_berry/">Black Berry</a>
                    </li>
                </ul>
            </li>
        </ul>
    </body>
</html>

这是我的方法(1),使用 for 循环和正则表达式匹配:

for link in soup.find_all("a", href=re.compile(r'(http:\/\/www\.mega\.pk\/mobiles-[A-z]+\/)(?=.*\1)', re.DOTALL)):
    link.get('href')

这根本不返回任何内容。

这是我的方法(2),使用 for 循环和正则表达式匹配:

for link in soup.find_all("a", href=re.compile(r'(http:\/\/www\.mega\.pk\/mobiles-\w+\/)(?!.*\1)', re.UNICODE | re.DOTALL)):
    link.get('href')

这也会返回重复的链接。

最佳答案

获取 href 内包含 mobiles 且带有 CSS selector 的所有链接:

soup.select("ul.asidemenu_h1 a[href*=mobiles]")

请注意,我将其限制为搜索具有 asidemenu_h1 类的 ul 内的链接 - 仅此一项就可以帮助您避免重复。 *= 这里的意思是“包含”。

<小时/>

如果您坚持使用正则表达式来检查 href 值:

menu = soup.find("ul", class_="asidemenu_h1")
links = menu.find_all("a", href=re.compile(r"mega\.pk\/mobiles-[a-zA-Z0-9_-]+\/$"))
for link in links:
    print(link.get_text())

关于python - 无法仅获取 1 次出现的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845409/

相关文章:

python - 如何将字典映射转换为 'integer aliasing'

python - TensorFlow 中的特征选择

python - 时间模块 - strptime Django 验证错误

javascript - 使用文件名从本地目录加载多个图像

html - 使用 UL Li 列表绘制导航栏的原因是什么?

PHP 正则表达式匹配标记前瞻问题

javascript - 为什么表达匹配整个句子

python - 在 redis 作业上存储 "meta"数据不起作用?

javascript - AJAX 和浏览器后退按钮

java拆分正则表达式: split string using any text between curly brackets and keep the delimiter