哪种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())
老师解答:
- 现在你可以在函数
find_item_price()
中看到,我的导师教了我一种从上面的 HTML
代码中提取商品价格的方法。他首先导入 re
模块并使用它在 pattern
变量中创建一个数字范围。但在他真正这样做之前,他挑战学生们自己尝试一下
我的解决方案:
- 但是我尝试的时候我自己,我用的是
find_item_price_way_two()
函数中的解法。我使用了 .strip()
方法并删除了欧元符号。答案和老师的一模一样。它是一个浮点数,它是可操纵的。
我同意老师也是正确的,但在我看来我的代码更短、更简单、更易读、更干净。
任何人都可以列出上述两种方法的优缺点吗?一个更有效率吗?更容易维护?其他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 是更通用的解决方案。
我有这个代码:
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())
老师解答:
- 现在你可以在函数
find_item_price()
中看到,我的导师教了我一种从上面的HTML
代码中提取商品价格的方法。他首先导入re
模块并使用它在pattern
变量中创建一个数字范围。但在他真正这样做之前,他挑战学生们自己尝试一下
我的解决方案:
- 但是我尝试的时候我自己,我用的是
find_item_price_way_two()
函数中的解法。我使用了.strip()
方法并删除了欧元符号。答案和老师的一模一样。它是一个浮点数,它是可操纵的。
我同意老师也是正确的,但在我看来我的代码更短、更简单、更易读、更干净。
任何人都可以列出上述两种方法的优缺点吗?一个更有效率吗?更容易维护?其他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 是更通用的解决方案。