gpt4 book ai didi

python - Web抓取中的多级标记存在检查-提高python的可读性

转载 作者:行者123 更新时间:2023-12-03 07:44:16 26 4
gpt4 key购买 nike

我正在研究通过同一模板构建的许多页面上运行的刮板。每个页面都包含有关特定项目的一些信息。在乐观的情况下,我想获取所有可用数据,为简单起见,我们说它的意思是名称,价格和描述。

页面的结构如下:

<div id="content">
<h1>Product name</h1>
<table id="properties">
<tbody>
<tr id="manufacturer-row">
<th>Manufacturer</th>
<td>Some-Mark</td>
</tr>
</tbody>
</table>
<p>Full description of the product</p>
</div>


适用于此情况的条件:
  • 标签是嵌套的,因此我需要测试每个级别
  • 的存在
  • 有些页面会丢失一些数据-表中的空列与丢失表
  • 一样
  • 某些页面完全没有内容,
  • 标记中的空文本是有效值,但必须记录缺少的标记
  • 丢失数据不是一种特殊情况。

  • 实际上,我测试检查每条信息的存在,这会导致很难读取的代码:
    content = soup.select_one("#content")
    if content:
    product_name_tag = content.select_one("h1")
    if product_name_tag:
    name = product_name_tag.text
    else:
    log("Product name tag not found")

    table = content.select_one("table")
    if table:
    manufacturer_tag = table.select_one("#manufacturer-row > td")
    if manufacturer_tag:
    manufacturer = manufacturer_tag.text
    else:
    log("Manufacturer tag not found")
    else:
    log("Table not found")
    else:
    log("Tag '#content' not found")

    return (
    name if name in locals() else None,
    manufacturer if manufacturer in locals() else None
    )

    在实际的应用程序中,代码很难阅读,因为我要查找的属性通常更嵌套,因此在提取其文本之前,我需要检查每个标签的存在。我想知道在代码可读性和简洁性方面是否有任何巧妙的方法来解决此问题?我的想法:

    创建一个函数以在标记存在的情况下提取标记的文本-将节省几行,但是在实际应用中,我必须使用正则表达式从文本中提取一些短语,因此仅使用一个函数是不够的。

    创建包装程序以记录丢失的部分(如果未返回任何内容而不是在“else”代码下)-以提高可读性。

    将每个数据的提取放到单独的函数中,如_get_content_if_available,_get_name_if_available

    这些解决方案似乎都不够好,不够简洁,因此,我想请教您一些想法。

    我也想知道是否只有在满足某些条件的情况下初始化变量,然后检查当前上下文中是否存在变量的方法才是好主意。

    最佳答案

    一切都取决于您要如何构造代码。我的建议是使用ChainMap中的collections。使用ChainMap,您可以为标签/键指定默认值,然后仅解析不丢失的值。这样,您就不会在代码库中杂乱无章:

    data = """<div id="content">
    <h1>Product name</h1>
    <table id="properties">
    <tbody>
    <tr id="manufacturer-row">
    <th>Manufacturer</th>
    <td>Some-Mark</td>
    </tr>
    </tbody>
    </table>
    <p>Full description of the product</p>
    </div>"""

    from bs4 import BeautifulSoup
    from collections import ChainMap

    def my_parse(soup):
    def is_value_missing(k, v):
    if v is None:
    print(f'Value "{k}" is missing!') # or log it!
    return v is None

    d = {}
    d['product_name_tag'] = soup.select_one("h1")
    d['manufacturer_tag'] = soup.select_one("#manufacturer-row td")
    d['description'] = soup.select_one("p")
    d['other value'] = soup.select_one("nav") # this is missing!
    return {k:v.text for k, v in d.items() if is_value_missing(k, v) == False}

    soup = BeautifulSoup(data, 'lxml')
    c = ChainMap(my_parse(soup), {'product_name_tag': '-default name tag-',
    'manufacturer_tag': '-default manufacturer tag-',
    'description': '-default description-',
    'other value': '-default other value-',
    })

    print("Product name = ", c['product_name_tag'])
    print("Other value = ", c['other value'])

    这将打印:
    Value "other value" is missing!
    Product name = Product name
    Other value = -default other value-

    关于python - Web抓取中的多级标记存在检查-提高python的可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50185657/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com