哪种Web Scraping提取方法更好?

Which Web Scraping extraction method is better?

我有这个代码:

import re

from bs4 import BeautifulSoup


ITEM_HTML = '''<html><head></head><body>
<li class="col-xs-6 col-sm-4 col-md-3 col-lg-3">
    <article class="product_pod">
            <div class="image_container">
                    <a href="catalogue/a-light-in-the-attic_1000/index.html"><img src="media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg" alt="A Light in the Attic" class="thumbnail"></a>
            </div>
                <p class="star-rating Three">
                    <i class="icon-star"></i>
                    <i class="icon-star"></i>
                    <i class="icon-star"></i>
                    <i class="icon-star"></i>
                    <i class="icon-star"></i>
                </p>
            <h3><a href="catalogue/a-light-in-the-attic_1000/index.html" title="A Light in the Attic">A Light in the ...</a></h3>
            <div class="product_price">
        <p class="price_color">£51.77</p>
<p class="instock availability">
    <i class="icon-ok"></i>
        In stock
</p>
    <form>
        <button type="submit" class="btn btn-primary btn-block" data-loading-text="Adding...">Add to basket</button>
    </form>
            </div>
    </article>
</li>
</body></html>
'''


soup = BeautifulSoup(ITEM_HTML, 'html.parser')


def find_item_price():
    locator = 'article.product_pod p.price_color'
    item_price = soup.select_one(locator).string

    pattern = '£([0-9]+\.[0-9]+)'
    matcher = re.search(pattern, item_price)
    return float(matcher.group(1))


def find_item_price_way_two():
    locator = 'article.product_pod p.price_color'
    item_price = soup.select_one(locator).string

    item_price_symbol = item_price
    item_price_int = float(item_price.strip('£'))
    return item_price_int


print(find_item_price())
print(find_item_price_way_two())

老师解答:

我的解决方案:

我同意老师也是正确的,但在我看来我的代码更短、更简单、更易读、更干净。

任何人都可以列出上述两种方法的优缺点吗?一个更有效率吗?更容易维护?其他pros/cons??

谢谢。

老师解法比较喜欢我,因为普遍。正则表达式是非常强大和简单的工具,尤其是在解析方面。除此之外,您的老师还想教您并展示热门案例。对于这种情况,程序通常使用 re。您可能已经在之前的课程中有过使用 RE 的经验,并且您的导师希望您记住。

.strip() 方法仅删除边上传递的符号。当你遇到更复杂的情况时,这对你没有帮助。

在这种情况下,您只需删除第一个字符。您可以为此使用切片。

def find_item_price_way_three():
    locator = 'article.product_pod p.price_color'
    item_price = soup.select_one(locator).string
    return float(item_price[1:])

我认为在这种情况下这是最好的方法,但请记住 RE 是更通用的解决方案。