我有:
<h2 id='names'>Names</h2>
<p>John</p>
<p>Peter</p>
Run Code Online (Sandbox Code Playgroud)
如果我已经拥有h2标签,那么现在最简单的方法就是将Peter带到这里?现在我试过了:
soup.select("#names > p:nth-child(1)")
Run Code Online (Sandbox Code Playgroud)
但在这里我得到了nth-child NotImplementedError:
NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type.
Run Code Online (Sandbox Code Playgroud)
所以我不确定这里发生了什么.第二种选择是让所有'p'标记子项和硬选择[1]但是那时存在索引超出范围的危险,这将需要围绕每次尝试以获得彼得的尝试/除了有点愚蠢.
有没有办法用soup.select()函数选择nth-child?
编辑: 用nth-type替换nth-child似乎可以解决问题,所以正确的行是:
soup.select("#names > p:nth-of-type(1)")
Run Code Online (Sandbox Code Playgroud)
不确定为什么它不接受nth-child但似乎nth-child和nth-of-type返回相同的结果.
Python 的诗歌依赖管理器允许通过命令指定可选的依赖:
$ poetry add --optional redis
Run Code Online (Sandbox Code Playgroud)
这导致此配置:
[tool.poetry.dependencies]
python = "^3.8"
redis = {version="^3.4.1", optional=true}
Run Code Online (Sandbox Code Playgroud)
但是,您如何实际安装它们?文档似乎暗示:
$ poetry install -E redis
Run Code Online (Sandbox Code Playgroud)
但这只是抛出和错误:
Installing dependencies from lock file
[ValueError]
Extra [redis] is not specified.
Run Code Online (Sandbox Code Playgroud) 嵌套Item数据的正确方法是什么?
例如,我想要一个产品的输出:
{
'price': price,
'title': title,
'meta': {
'url': url,
'added_on': added_on
}
Run Code Online (Sandbox Code Playgroud)
我有scrapy.Item:
class ProductItem(scrapy.Item):
url = scrapy.Field(output_processor=TakeFirst())
price = scrapy.Field(output_processor=TakeFirst())
title = scrapy.Field(output_processor=TakeFirst())
url = scrapy.Field(output_processor=TakeFirst())
added_on = scrapy.Field(output_processor=TakeFirst())
Run Code Online (Sandbox Code Playgroud)
现在,我这样做只是根据新的项目模板重新格式化管道中的整个项目:
class FormatedItem(scrapy.Item):
title = scrapy.Field()
price = scrapy.Field()
meta = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)
并在管道中:
def process_item(self, item, spider):
formated_item = FormatedItem()
formated_item['title'] = item['title']
formated_item['price'] = item['price']
formated_item['meta'] = {
'url': item['url'],
'added_on': item['added_on']
}
return formated_item
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?还是有一种更直接的方法来解决这个问题而不违反框架的理念?
做组合别名的最pythonic和正确的方法是什么?
这是一个假设的场景:
class House:
def cleanup(self, arg1, arg2, kwarg1=False):
# do something
class Person:
def __init__(self, house):
self.house = house
# aliases house.cleanup
# 1.
self.cleanup_house = self.house.cleanup
# 2.
def cleanup_house(self, arg1, arg2, kwarg1=False):
return self.house.cleanup(arg1=arg1, arg2=arg2, kwarg1=kwarg1)
Run Code Online (Sandbox Code Playgroud)
AFAIK 与 #1 我测试的编辑器理解这些和 #2 一样好 - 自动完成、文档字符串等。
#1 方法有什么缺点吗?从python的角度来看,哪种方式更正确?
扩展方法 #1 unsettable 和类型提示的变体将不受评论中指出的所有问题的影响:
class House:
def cleanup(self, arg1, arg2, kwarg1=False):
"""clean house is nice to live in!"""
pass
class Person:
def __init__(self, house: House):
self._house = house
# aliases
self.cleanup_house …
Run Code Online (Sandbox Code Playgroud) 我有一个假设的asyncio.gather
场景:
await asyncio.gather(
cor1,
[cor2, cor3],
cor4,
)
Run Code Online (Sandbox Code Playgroud)
我愿意在这里cor2
按cor3
顺序被处决。除了像这样定义外部协程之外,还有其他快捷方式吗:
async def cor2_cor3():
await cor2
await cor3
await asyncio.gather(
cor1,
cor2_cor3,
cor4,
)
Run Code Online (Sandbox Code Playgroud)
有没有更干净的捷径?
在内置的 python 日志模块中,您创建一个记录器并记录消息:
\nimport logging\nlog = logging.getLogger('mylogger')\nlog.info('starting!')\n
Run Code Online (Sandbox Code Playgroud)\n您还可以将附加信息传递给格式化程序稍后将使用的日志消息:
\nuser = 'john doe'\nlog.info('starting!', extra={'user': 'john doe'})\n
Run Code Online (Sandbox Code Playgroud)\n然而,对每条消息都明确地执行此操作是相当乏味的。是否可以为整个记录器设置额外的内容,以便它们会随每个日志一起传递?
\n就像是:
\nlog = logging.getLogger('mylogger')\nlog.extras = {'user': 'john doe'}\nlog.info('starting!')\n
Run Code Online (Sandbox Code Playgroud)\n目前看来唯一的方法是猴子补丁log()
方法:
def patch_default_extras(logger, extras):\n original_log = logger.log\n\n def log_with_extras(level, msg, *args, **kwargs):\n kwargs['extra'] = {**extras, **kwargs.get('extra', {})}\n return original_log(level, msg, *args, **kwargs)\n\n logger.log = log_with_extras\n\n\nmylog = logging.getLogger('mylogger')\npatch_default_extras(mylog, {'user': 'john doe'})\nmylog = logging.getLogger('mylogger')\nmylog.log(logging.ERROR, 'hello')\n
Run Code Online (Sandbox Code Playgroud)\n这是相当丑陋的,但除非我错过了一些东西 \xe2\x80\x92 这是唯一的方法?
\n在图像选项方面,重构的文本标记似乎非常有限:
可识别以下选项:
alt :文本
height :长度
width :当前行宽度的长度或百分比
scale :整数百分比(“%”符号是可选的)
align :“顶部”、“中间”、“底部”、“ left"、"center" 或 "right"
目标:文本(URI 或引用名称)
是否可以通过 reStructuredText 标记设置一些自定义属性,例如标题?
例如
.. image:: foobar.jpg
:title: mouse over text, hi!
Run Code Online (Sandbox Code Playgroud)
会输出:
<img src="foobar.jpg" title="mouse over text, hi!"></img>
Run Code Online (Sandbox Code Playgroud) x = 'foo' if x == 'bar' else x
Run Code Online (Sandbox Code Playgroud)
现在这将等于:
x = 'foo' if x == 'bar'
Run Code Online (Sandbox Code Playgroud)
但这会返回"无效语法"错误.是否有这样的原因,或者设计决策背后的原因是什么?因为如果函数是多行的(例如#2的函数):
if x == 'foo':
x = 'bar'
Run Code Online (Sandbox Code Playgroud)
它完美无缺.
我很想知道是否可以抓取网站上任意深度的所有页面和链接,即使在跟踪几个链接后顶部 URL 发生变化?这是一个例子:
热门网址:www.topURL.com
有 3 个链接:www.topURL.com/link1、www.topURL.com/link2 和 www.topURL.com/link3
然后,如果我们点击 www.topURL.com/link1,它会将我们带到一个页面,该页面本身有
2 个链接:www.topURL.com/link4 和 www.topURL.com/link5
但如果我们点击 www.topURL.com/link4 ,它会将我们带到一个包含以下 2 个链接的页面:www.anotherURL.com/link1 和 www.thirdURL.com/link1
scrapy 或任何 python 爬虫/蜘蛛是否可以从 www.topURL.com 开始,然后跟踪链接并最终到达 www.thirdURL.com/link1?
它的深度有限制吗?有任何代码示例向我展示如何做到这一点吗?
谢谢您的帮助。
Python 3.8 引入了TypedDict
应该用于输入 dict 对象的类:
from typing import TypedDict
class MyDict(TypedDict):
name: str
type(MyDict(name='foo'))
# dict
Run Code Online (Sandbox Code Playgroud)
这里的问题是,由其创建的最终对象TypedDict
是一个dict
类型对象,并且丢失了对原始创建类的任何类型的引用MyDict
。
换句话说,type(MyDict(name='foo'))
应该生成dict
对象而不是MyDict
对象。
是否可以修补TypedDict
此功能?dict
或者,也许在生成的对象中我缺少对原始类的引用?
我有:
<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');"
Run Code Online (Sandbox Code Playgroud)
我想获取网址,但是如果不使用正则表达式,我将无法做到这一点。可能吗?
到目前为止,我使用正则表达式的解决方案是:
url = re.findall('\('(.*?)'\)', soup['style'])[0]
Run Code Online (Sandbox Code Playgroud) python ×8
web-scraping ×3
scrapy ×2
logging ×1
pelican ×1
python-3.x ×1
string ×1
web-crawler ×1